我有以下代码:
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循环中进行管道读/写的方式是顺序还是并发?
答案 0 :(得分:1)
for()
循环之后打印从getpid()
返回的值将同时打印(多个)子pid和父pid。
无法保证首先对printf()
的调用执行什么流程。
所以pid值可以(并且如你所见)可能会被打印成一些随机的&#39;顺序。
答案 1 :(得分:1)
当您分叉子进程时,父进程和子进程同时运行。除非他们做一些同步它们的事情,否则它们每次运行的顺序都是不可预测的。
对于for
循环,管道中的读取和写入正在同步进程:父级无法从read()
返回,直到孩子调用write()
为止。并且他们不会分娩新孩子,直到他们都这样做了。
但是在循环完成后,没有任何东西可以同步进程,因此它们都会以任何顺序打印它们的PID。