0

我是一个新手,试图真正理解系统编程。在下面的程序中,我正在读取一个名为“temp1”的文件(包含 1 2 3 4)并将其内容打印到标准输出。但是,我还想检查 open 返回的文件描述符的值。如果我在第 5 行的 printf 调用中包含 '\n',则输出会先打印值 filep,然后再打印文件的内容。但是如果我删除换行符,文件的内容会首先打印,然后是 filep 的值。为什么会发生这种情况?

     int main(){
     char buf[BUFSIZ];
     int n, filep;

     // Open the file
     filep = open("temp1", 'r');
     printf("%d\n", filep); // the newline alters program behaviour

     while((n=read(filep, buf, BUFSIZ)) > 0)
         write(1, buf, n);
     return 0;
    }

我正在使用 gcc 4.6.3。

4

1 回答 1

3

<stdio.h>像这样的函数printf缓冲了。输出函数write(2)只会不时调用系统调用,通常像printfetc... 这样的输出函数只会进入内部FILE缓冲区。

stdout输出到终端时是行缓冲的(参见isatty (3))。因此,如果printf格式字符串以\n写入结尾,则会发生。

您可以在循环之前添加fflush(stdout);fflush(NULL);调用。while

参见fflush(3)setvbuf(3)

如果您不刷新stdout(使用\nprintf 格式字符串,或显式通过fflushfclose),则缓冲区仅在结束时刷新main(通过一些隐式atexit(3) ...)

所以发生在你身上的是(没有\n)数据保留在stdout缓冲区中,并且实际上仅在程序退出时(由write(2)内部库)写入。stdio

阅读高级 linux 编程

于 2013-05-11T07:28:53.623 回答