#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int i;
int fd[2];
int values[argc - 1];
for( i = 1; i < argc; i++ ) {
pipe(fd);
switch( fork()) {
case 0: /* child */
/* Do stuff */
close(fd[0]);
int value = atoi(argv[i]);
write(fd[1], &value, sizeof(value));
exit( 0 );
case -1:
perror( "fork" );
exit(1);
default: /* parent */
close(fd[1]);
read(fd[0], &values[i - 1], sizeof(values[i - 1]));
/* do stuff, but don't wait() or terminate */
}
}
for (i = 0; i < (argc - 1); i++)
{
printf("%d\n", values[i]);
}
return 0;
}
我尝试创建与赋予可执行文件的参数数量一样多的进程,并让每个进程将参数通过管道传递给父进程并存储到数组中,最后打印出数组的元素。由于进程是并行运行的,当我打印出数组元素时,相对于我输入这些元素的顺序,顺序应该是随机的,但情况似乎并非如此,因为我已经运行了可执行文件 100 万次,有人可以吗告诉我问题是什么?所以有人善意地指出,读取序列化了事物,我应该怎样做才能使进程真正并行?
最佳答案
父级中的管道read
会序列化事物。
您 (1) 创建子项; (2)子进程向管道写入; (3) 父级将阻塞在read
上,直到有东西要读。对所有 child 重复此操作。
关于涉及管道的c并行进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21081526/