执行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()输出多次的问题
- APUE-8.3节fork函数实例,printf输出两次问题
- 关于printf输出结果的一些问题
- 关于C语言的printf输出问题
- 相对printf(),对于多线程的cout<<输出乱码的问题
- printf()输出缓存问题
- 凌阳SPCE3200精简开发板:解决附带实验程序中printf无法输出串口调试日志信息的问题
- 关于SQL中 动态执行SQL语句并且获得动态SQL语句输出参数值的问题
- 控制台程序的中文输出乱码问题,printf,wprintf与setlocale
- 关于printf输出结果的一些问题
- 使用printf修改变量的值 —— VS2008中使用%n输出遇到的问题及解决方法
- printf、cout 取值输出问题,(从右向左求值,从左向右输出??)??
- C中printf循环输出不及时显示的问题
- fork()前的printf打印两次的问题
- C中printf循环输出不及时显示的问题
- SQL----带输入、输出参数的动态SQL的执行问题
- sql语句,exec执行 拼接的字符串 输出参数 问题
- qt 中文显示问题.(用printf 输出QString 内容)
- printf输出%f %lld问题。输出类型和数据类型不匹配会发生什么?
- 一道C语言面试题printf输出问题,高手们都来看看吧