当前位置: 技术问答>linux和unix
为什么fork后,重定向会输出两次,疑惑
来源: 互联网 发布时间:2016-11-30
本文导语: #include #include int main() { pid_t pid; int bb = 10; printf("tttTestn"); if ((pid = fork()) == 0) { bb++; } else sleep(2); printf("%dn", bb); return 0...
#include
#include
int main()
{
pid_t pid;
int bb = 10;
printf("tttTestn");
if ((pid = fork()) == 0)
{
bb++;
}
else
sleep(2);
printf("%dn", bb);
return 0;
}
在终端直接运行的话,是
tttTest
11
10
但是如果a.out > tt
然后看tt文件时,
会出现两次
tttTest,
这是为什么?
|
楼主好好看看I/O的缓冲机制。
标准输出是行缓冲,重定向后,标准输出是全缓冲的
当调用fork时tttTest这行仍保存在缓冲中,并随着数据段复制到子进程缓冲中。这样,这一行就分别进入父子进程的输出缓冲中,余下的输出就接在了这一行的后面。
如果要想只打印一行,可以如下:
标准输出是行缓冲,重定向后,标准输出是全缓冲的
当调用fork时tttTest这行仍保存在缓冲中,并随着数据段复制到子进程缓冲中。这样,这一行就分别进入父子进程的输出缓冲中,余下的输出就接在了这一行的后面。
如果要想只打印一行,可以如下:
#include
#include
int main()
{
pid_t pid;
int bb = 10;
printf("tttTestn");
fflush(stdout); //插入这一行
if ((pid = fork()) == 0)
{
bb++;
}
else
sleep(2);
printf("%dn", bb);
return 0;
}