您的位置:首页 > 其它

执行fork后printf的输出问题

2017-10-31 14:06 330 查看
int main(void)
{
printf("123456\n");
if(fork())
exit(1);
else
exit(1);
}
终端上输出:
~$ ./a.out123456
输出重定向到文件后读取文件:
~$ ./a.out > test~$ cat test123456123456

原因:
当直接由终端输出时,此时标准io采用行缓冲,即缓冲区有换行符后马上输出:
进程执行./a.out时,代码运行至printf("123456\n");终端检测到缓冲区中有换行符,此时直接冲刷缓冲区,将数据输出,缓冲区为空,以至于后面执行fork()时
因为父进程缓冲区中并没有数据,子进程复制的缓冲区也为空,子进程结束后,并没有数据输出

当输出重定向到文件时,此时标准io采用全缓冲,即缓冲区必须满一定大小后才会输出,进程结束时会刷新缓冲区,输出数据,或者调用fflush():

由于采用全缓冲,缓冲区的数据并没有直接输出,因为缓冲区并没有满,以至于后面fork()函数执行时子进程也复制了父进程的缓冲区,此时两个缓冲区中都有123456\n
的数据,当父进程和子进程结束时,两个缓冲区都会被冲刷,所以123456有两行

int main(void)
{
printf("123456");
if(fork())
exit(1);
else
exit(1);
}去掉换行符'\n'后
终端上输出:
~$ ./a.out123456123456

输出重定向到文件后读取文件:

~$ ./a.out > test~$ cat test123456123456

此时的结果相同,因为没有换行符
------------------------------------------------------------------
进一步的实验
int main(void)
{
printf("123456\n");
sleep(2);
}
int main(void)
{
printf("123456");
sleep(2);
}比较两种输出到终端的结果
上面一个程序会在程序运行后立刻输出123456,之后睡眠两秒,进程终止
下面一个程序会在程序运行后先睡眠两秒,然后输出123456,进程终止
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fork printf unix