执行fork后printf的输出问题
来源:互联网 发布:软件许可协议 英文 编辑:程序博客网 时间:2024/06/05 02:50
int main(void){ printf("123456\n"); if(fork()) exit(1); else exit(1);}
终端上输出:
~$ ./a.out
123456
输出重定向到文件后读取文件:
~$ ./a.out > test
~$ cat test
123456
123456
原因:当直接由终端输出时,此时标准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.out
123456123456
输出重定向到文件后读取文件:
~$ ./a.out > test
~$ cat test
123456123456
此时的结果相同,因为没有换行符
------------------------------------------------------------------
进一步的实验
int main(void){ printf("123456\n"); sleep(2);}int main(void){ printf("123456"); sleep(2);}比较两种输出到终端的结果上面一个程序会在程序运行后立刻输出123456,之后睡眠两秒,进程终止
下面一个程序会在程序运行后先睡眠两秒,然后输出123456,进程终止
阅读全文
0 0
- 执行fork后printf的输出问题
- fork后printf如何输出
- fork()引起的printf()输出多次的问题
- fork ,exit printf 的两次输出
- APUE-8.3节fork函数实例,printf输出两次问题
- fork与printf的缓存问题
- 【学习笔记】关于一道fork()之后printf()输出的题目
- 有关printf输出的问题
- fork后进程的执行开始位置
- fork()前的printf打印两次的问题
- 关于C语言中printf()后的scanf()不执行问题,解决方法
- 关于fork多进程中printf的问题
- fork创建子进程(printf的打印次数问题)
- 关于printf输出结果的一些问题
- c中printf的输出问题
- 遇到printf输出问题
- printf()输出缓存问题
- printf输出缓存问题
- RT-Thread之python和scons
- python中List添加、删除元素的几种方法
- android——图片缩放(双击放大、手势缩放)
- 二叉树的概念及创建及遍历
- Java 开发环境变量
- 执行fork后printf的输出问题
- TensorFlow-placeholder
- 关于“暗网”的问题
- Qt5.9.1 QDoubleValidator 直接构建失效的解决办法
- 记录一次cpu 100%线上问题排查
- spring 4.2.4 与 Jackson 2.7 所引出的问题
- click点击事件触发两次ajax请求
- zepto 源码分析2
- Tensorflow -1-hello world! MNIST