Difference in Output between printf(“/n…”) and printf(“../n”) in Linux
谁能解释一下为什么这两个相似的代码(除了 /
位置)会导致不同的输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
int main() { int pid, i=0; printf("Ready to fork/ "); pid=fork(); if (pid==0) { printf("Child starts/ "); for (i=0; i<1000; i++); printf("Child ends/ "); } else { wait(0); for (i=0; i<1000; i++); printf("Parent process ends/ "); } return 1; } |
输出:
还有这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
#include <unistd.h>
#include<sys/wait.h>
#include <stdio.h>
int main() { int pid, i=0; printf("/ Ready to fork %d", getpid()); pid=fork(); if (pid==0) { printf("/ Child starts %d",getpid()); for (i=0; i<1000; i++); printf("/ Child ends %d", getpid()); } else { wait(0); for (i=0; i<1000; i++); printf("/ Parent process ends %d", getpid()); } return 1; } |
结果:
我真的找不到任何令人满意的理由来解释为什么 /
的位置的简单更改会在 fork 执行完成后父程序似乎重新启动的级别更改程序的输出。
提前谢谢你。
- 您可以格式化您的代码,以便其他人阅读它。而且,‘/
‘ 通常在末尾。输出没有变化。
-
@IharobAlAsimi:你的意思是输出没有变化?整个问题询问为什么输出会发生变化。它显示更改的输出。
-
我不会阅读未格式化的代码,但可能会使用 printf 与 c 中的 fork() 重复
-
我现在看到了,只是我一开始没有注意到它。
-
@L?°uV??nhPhúc 是的,重复
除非程序的输出被重定向到一个文件,否则 printf()ing /
默认情况下会刷新 printf() 内部使用的用户空间缓冲区。
在fork()之前不刷新缓冲区意味着子进程获得了父进程尚未刷新缓冲区的副本。由于这个原因,您在不打印 /
的版本中看到两次 Ready to fork,因为对 printf() 的调用以打印 Ready to fork 是在调用 fork().
之前执行的
- 这就解释了。非常感谢你。
-
有点困惑……是孩子获取缓冲区数据,还是当控件返回调用者并找到”////
” 它会刷新缓冲区吗?
-
子进程总是通过 fork()ing 获得父缓冲区的副本。问题是:这个缓冲区是否为空?好吧,如果缓冲区在调用 fork() 之前被刷新,它肯定是空的。通过使用尾随 /
调用 printf() 来刷新缓冲区(除非重定向输出或更改刷新策略)。在您的第一种情况下,父母正在这样做。
-
请注意,在 fork() 之后,两个缓冲区(父进程和子进程)都是独立的(即:每个进程都有自己的副本),但是当子进程获得父缓冲区的副本时(即: 子缓冲区是用当时父缓冲区的内容初始化的)。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/269340.html