• 重定向输出遇到的缓冲问题


    一个项目中需要迭代计算,时间长,但是在重定向输出的时候所有标准输出不能及时输出,这就要求程序主函数正常运行完后才能正常输出到文件。

    因为标准输出到终端时默认行缓冲或无缓冲,重定向到硬盘之后,就变成了全缓冲


    1. Fully buffered means that I/O takes place only when the buffer is fully, the process explicitly calls fflush, or the process terminates by calling exit. A common size for the standard I/O buffer is 8192 bytes;
     
    2. Line buffered means that I/O takes place when a newline is encountered, when the process calls fflush, or when the process terminates by calling exit.
     
    3. Unbuffered means that I/O take place each time a standard I/O output function is called.
     

    解决方法有 fflush  , setvbuf  ,  和伪终端

    1. 每次printf时都刷新缓存区强制输出,fflush(stdout)

    2. setvbuf 更改缓冲类型,手动设置缓冲区大小,使之足够小。

    int setvbuf( FILE *stream, char *buffer, intmode, size_tsize );

    The setvbuf function allows the program to control both buffering and buffer size forstream.stream must refer to an open file that has not undergone an I/O operation since it was opened. The array pointed to bybuffer is used as the buffer, unless it isNULL, in which casesetvbuf uses an automatically allocated buffer of lengthsize/2 * 2 bytes.

    The mode must be _IOFBF, _IOLBF, or _IONBF. If mode is _IOFBF or _IOLBF, then size is used as the size of the buffer. If mode is_IONBF, the stream is unbuffered andsize and buffer are ignored. Values formode and their meanings are:

    _IOFBF

    Full buffering; that is, buffer is used as the buffer andsize is used as the size of the buffer. Ifbuffer is NULL, an automatically allocated buffersize bytes long is used.

    _IOLBF

    With MS-DOS, the same as _IOFBF.

    _IONBF

    No buffer is used, regardless of buffer or size.

    对于 _IOFBF _IOLBF ,dos上并没有区别,第四个参数size指定了缓冲区的大小,并且,当第二个参数,一个字符串buffer没有指定的情况下,系统将自动分配一片内存,长度为 (unsigned int)(size/2) * 2  ,每次向缓冲区写size个,大于缓冲区大小后,自动输出。


    测试:

    x.cpp

    #include <stdio.h>
    #include <windows.h>
    
    int main(int argc, char *argv[])
    {
    	setvbuf(stdout, 0, _IOFBF, 10);
    	printf("hello world\n");
    	Sleep(10000000);
    	
    	return 0;
    }

    cl x.cpp
    x > re.txt
    pause

    运行后直接退出

    输出 hello worl


    将10改成14后没有输出

    改成4后输出 hello wo


    在这个项目中 setvbuf(stdout, 0, _IONBF, 0);





  • 相关阅读:
    第十天冲刺个人博客
    第九天冲刺个人博客
    软件工程学习进度表(十六周)
    部署一个件简简单单的项目竟然会遇到这么多事?
    Apache和Tomcat公用80端口
    windows下nginx中配置端口转发 ----本文来自转载
    linux中nginx中配置端口转发
    字体图标:Font Awesome
    最新主流 Markdown 编辑器推荐
    博客园如何转载别人的文章(来自转载)
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106903.html
Copyright © 2020-2023  润新知