linux中line buffered和fully buffered的区别

line buffered:遇到换行或者缓冲区满再做flush

fully buffered:缓冲区满做flush

标准输出和终端设备相连时(例如默认情况下stdout 为显示器,或者嵌入式设备中的stdout为

串口终端)它是line buffered,否则是(例如./a.out > temp.out 采用">"将输出重定位到文件)fully buffered。

_____________________________________________________________________________________

以APUE 例8.1说明

程序如下:

#include "apue.h"

int     glob = 6;       /* external variable in initialized data */
char    buf[] = "a write to stdout\n";

int
main(void)
{
    int       var;      /* automatic variable on the stack */
    pid_t     pid;

    var = 88;
    if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)
        err_sys("write error");
    printf("before fork\n");    /* we don't flush stdout */

    if ((pid = fork()) < 0) {
        err_sys("fork error");
    } else if (pid == 0) {      /* child */
        glob++;                 /* modify variables */
        var++;
    } else {
        sleep(2);               /* parent */
    }

    printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
    exit(0);
}


的输出结果为

$ ./a.out
a write to stdout
before fork
pid = 430, glob = 7, var = 89      child's variables were changed
pid = 429, glob = 6, var = 88      parent's copy was not changed
$ ./a.out > temp.out
$ cat temp.out
a write to stdout
before fork
pid = 432, glob = 7, var = 89
before fork
pid = 431, glob = 6, var = 88


所以可以发现采用重定位输出后,printf缓冲区的内容也一起被复制到子进程,

直到在exit之前才做flush,将所有缓冲区中的内容一起输出到文件




你可能感兴趣的:(linux中line buffered和fully buffered的区别)