一个奇怪的程序
来源: 互联网 发布时间:2015-12-25
本文导语: hello.c如下所示 #include int main() { printf("Hello,n"); if(fork()==0) printf("worldn"); exit(1); } make hello ./hello执行结果为:Hello, world 但./hello > hello.txt后查看hello.txt却为: ...
hello.c如下所示
#include
int main()
{
printf("Hello,n");
if(fork()==0)
printf("worldn");
exit(1);
}
make hello
./hello执行结果为:Hello,
world
但./hello > hello.txt后查看hello.txt却为:
Hello,
world
Hello,
有谁知道这是为什么么??
#include
int main()
{
printf("Hello,n");
if(fork()==0)
printf("worldn");
exit(1);
}
make hello
./hello执行结果为:Hello,
world
但./hello > hello.txt后查看hello.txt却为:
Hello,
world
Hello,
有谁知道这是为什么么??
|
摘自《Unix环境高级编程》,第八章。
------------------------------
标准 I / O库是带缓存的。回忆一下5 . 1 2节,如果标准输出连到终端设备,则它是行缓存的,否则它是全缓存的。当以交互方式运行该程序时,只得到p r i n t f输出的行一次,其原因是标准输出缓存由新行符刷新。但是当将标准输出重新定向到一个文件时,却得到p r i n t f输出行两次。其原因是,在f o r k之前调用了p r i n t f一次,但当调用f o r k时,该行数据仍在缓存中,然后在父进程数据空间复制到子进程中时,该缓存数据也被复制到子进程中。于是那时父、子进程各自有了带该行内容的缓存。在 e x i t之前的第二个p r i n t f将其数据添加到现存的缓存中。当每个进程终止时,其缓存中的内容被写到相应文件中。
------------------------------
标准 I / O库是带缓存的。回忆一下5 . 1 2节,如果标准输出连到终端设备,则它是行缓存的,否则它是全缓存的。当以交互方式运行该程序时,只得到p r i n t f输出的行一次,其原因是标准输出缓存由新行符刷新。但是当将标准输出重新定向到一个文件时,却得到p r i n t f输出行两次。其原因是,在f o r k之前调用了p r i n t f一次,但当调用f o r k时,该行数据仍在缓存中,然后在父进程数据空间复制到子进程中时,该缓存数据也被复制到子进程中。于是那时父、子进程各自有了带该行内容的缓存。在 e x i t之前的第二个p r i n t f将其数据添加到现存的缓存中。当每个进程终止时,其缓存中的内容被写到相应文件中。