2013-05-11 61 views
0

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

 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。

+2

@GrijeshChauhan:?? open syscall返回一个文件描述符,它是一个整数。 printf打印该文件描述符的值。 – hssay 2013-05-11 07:33:04

+0

是的你是对的! ...考虑我评论的第二点 – 2013-05-11 07:35:02

回答

2

<stdio.h>功能如printf缓冲。输出函数只会不时地调用write(2)系统调用,通常输出函数如printf等......只会进入内部的FILE缓冲区。

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

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

fflush(3)setvbuf(3)

如果不刷新stdout(无论是在格式化字符串一个\n,或明确直通fflushfclose)缓冲区只在main末刷新(将向您介绍一些隐atexit(3) ...)

那么,什么是发生在你的是,(没有\n)数据保持在stdout缓冲区,实际写入(由write(2)stdio库)只在你的程序退出。

阅读advanced linux programming

+0

@ Basile:谢谢。我从你的扩展答案中得到了答案。很好的解释。 – hssay 2013-05-11 07:49:15