gpt4 book ai didi

涉及管道的c并行进程

转载 作者:行者123 更新时间:2023-11-30 17:41:28 26 4
gpt4 key购买 nike

#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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com