C并发进程和管道

时间:2016-02-10 23:57:45

标签: c pipe fork

我有以下代码:

for(i=0; i < argc; i++)
{
     pipe(fd[2]);
     pid=fork();

     if (pid > 0)
     {
          close(fd[1]);
          // read the string, and print it
     }
     else if (pid == 0)
     {
          close(fd[0]);
          // write the file name to the main process
          break;
     }    
}

// wait for all processes to finish

基本上,它按顺序输出每个文件名:

file1
file2
file3

但是如果我在for循环之后放置printf("%d\n", getpid()),输出似乎是并发的。首先打印一些具有更高进程ID的进程。

我的问题是,我在for循环中进行管道读/写的方式是顺序还是并发?

2 个答案:

答案 0 :(得分:1)

for()循环之后

打印从getpid()返回的值将同时打印(多个)子pid和父pid。

无法保证首先对printf()的调用执行什么流程。

所以pid值可以(并且如你所见)可能会被打印成一些随机的&#39;顺序。

答案 1 :(得分:1)

当您分叉子进程时,父进程和子进程同时运行。除非他们做一些同步它们的事情,否则它们每次运行的顺序都是不可预测的。

对于for循环,管道中的读取和写入正在同步进程:父级无法从read()返回,直到孩子调用write()为止。并且他们不会分娩新孩子,直到他们都这样做了。

但是在循环完成后,没有任何东西可以同步进程,因此它们都会以任何顺序打印它们的PID。