C fork程序行为说明

时间:2015-02-04 05:27:32

标签: c unix fork

我完全不熟悉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;
  }

1 个答案:

答案 0 :(得分:2)

您的信息基本上是正确的。

当输出到达终端时,输出是行缓冲的。当输出转到管道时,输出完全缓冲,因此其中一个进程首先完成其输出。您可以在fflush(stdout)中的每次迭代后添加writeloop(),或使用setvbuf()使其进行行缓冲,甚至是无缓冲的输出。

顺便提一下,请注意,子进程和父进程之间不共享全局变量;他们每个人都有自己的变量副本。