C/Unix在使用系统调用和printf时的奇怪行为
我是个新手,试图真正理解系统编程。在下面的程序中,我正在读取一个名为“temp1”的文件(包含1234)并将其内容打印到stdout。但是,我还想检查open返回的文件描述符的值。如果在第5行的printf调用中包含“\n”,则输出将首先打印值filep,然后打印文件内容。但是如果我删除换行符,文件的内容会先打印出来,然后是filep的值。 为什么会发生这种情况C/Unix在使用系统调用和printf时的奇怪行为,c,unix,system-calls,C,Unix,System Calls,我是个新手,试图真正理解系统编程。在下面的程序中,我正在读取一个名为“temp1”的文件(包含1234)并将其内容打印到stdout。但是,我还想检查open返回的文件描述符的值。如果在第5行的printf调用中包含“\n”,则输出将首先打印值filep,然后打印文件内容。但是如果我删除换行符,文件的内容会先打印出来,然后是filep的值。 为什么会发生这种情况 int main(){ char buf[BUFSIZ]; int n, 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。
像printf
这样的函数是缓冲的。输出函数只会不时调用write(2)
syscall,通常输出函数如printf
等。。。只进入内部文件
缓冲区
当输出到终端时,stdout
是行缓冲的(请参阅)。因此,如果printf
格式字符串以\n
结尾,将发生写入
您可以添加一个fflush(stdout)代码>或fflush(空)代码>在while
循环之前调用
看到和
如果不刷新stdout
(使用printf格式字符串中的\n
,或显式地通过fflush
或fclose
)缓冲区仅在main
的末尾刷新(通过一些隐式…)
因此,发生在您身上的是(没有\n
)数据停留在标准输出
缓冲区中,并且实际上只在程序出口处写入(由write(2)
内部stdio
库写入)
阅读。@GrijeshChauhan:??open syscall返回一个文件描述符,它是一个整数。printf打印该文件描述符的值。是的,您是正确的。。。考虑我的评论的第二点:巴西尔:谢谢。我是从你的扩展答案中得到的。很好的解释。