Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C/Unix在使用系统调用和printf时的奇怪行为_C_Unix_System Calls - Fatal编程技术网

C/Unix在使用系统调用和printf时的奇怪行为

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; //

我是个新手,试图真正理解系统编程。在下面的程序中,我正在读取一个名为“temp1”的文件(包含1234)并将其内容打印到stdout。但是,我还想检查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。

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打印该文件描述符的值。是的,您是正确的。。。考虑我的评论的第二点:巴西尔:谢谢。我是从你的扩展答案中得到的。很好的解释。