我完全不熟悉C语言和Unix系统。我可能会严重或错误地表达自己。我有一个C程序,其中两个进程将全局变量增加到30.我知道输出顺序是随机的并行处理。 但是在使用 |时更多管道,输出始终相同:子项1-30 - >家长1-30。怎么来的?
我被告知在使用printf打印变量时,变量内容会在打印到屏幕之前发送到缓冲区。显然你可以使用新行(\ n)来立即刷新缓冲区。这些信息是否已连接?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
int g_ant = 0;
void writeloop(char *text)
{
long i = 0;
while (g_ant < 30)
{
if (++i % 100000 == 0)
printf("%s: %d\n", text, ++g_ant);
}
}
int main(void)
{
pid_t pid;
pid = fork();
if (pid == 0)
{ /* child */
writeloop("Child");
exit(0);
}
writeloop("Parent"); /* parent */
waitpid(pid, NULL, 0);
return 0;
}
答案 0 :(得分:2)
您的信息基本上是正确的。
当输出到达终端时,输出是行缓冲的。当输出转到管道时,输出完全缓冲,因此其中一个进程首先完成其输出。您可以在fflush(stdout)
中的每次迭代后添加writeloop()
,或使用setvbuf()
使其进行行缓冲,甚至是无缓冲的输出。
顺便提一下,请注意,子进程和父进程之间不共享全局变量;他们每个人都有自己的变量副本。