gpt4 book ai didi

c - fork 多个进程并让父进程等待所有进程(在 C 中)

转载 作者:行者123 更新时间:2023-12-02 07:54:13 24 4
gpt4 key购买 nike

我正在创建各种流程(准确地说是 3 个流程)并让它们做不同的事情。到目前为止,一切都很好。我试图在 parent 中等待,直到所有 child 都完成。我玩过很多选项(例如下面列出的选项),但要么是 parent 等待,但我必须按 enter 键返回 shell(这意味着某个 child 在 parent 之后完成?),要么 parent 永远不会返回壳。有任何想法吗?指向哪里寻求更多帮助的指针?谢谢

 #include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

#define READ_END 0
#define WRITE_END 1


int main (int argc, char **argv)
{
pid_t pid;
int fd[2];
int fd2[2];

pipe(fd);
pipe(fd2);

for (int i=0; i<3; i++) {
pid=fork();

if (pid==0 && i==0) {

//never uses fd2, so close both descriptors
close(fd2[READ_END]);
close(fd2[WRITE_END]);

printf("i'm the child used for ls \n");
close(fd[READ_END]); /*close read end since I don't need it */
dup2(fd[WRITE_END], STDOUT_FILENO);
close(fd[WRITE_END]);
execlp("ls", "ls", "-hal", NULL);


break; /*exit for loop to end child's code */
}

else if (pid==0 && i==1) {
printf("i'm in the second child, which will be used to run grep\n");
close(fd[WRITE_END]);
dup2(fd[READ_END], STDIN_FILENO);
close(fd[READ_END]);

close(fd2[READ_END]);
dup2(fd2[WRITE_END], STDOUT_FILENO);
close(fd2[WRITE_END]);
execlp("grep", "grep","p",NULL);
break;
}
else if (pid==0 && i==2) {

//never uses fd so close both descriptors
close(fd[READ_END]);
close(fd[WRITE_END]);

printf("i'm in the original process which will be replaced with wc\n");

close(fd2[WRITE_END]);
dup2(fd2[READ_END], STDIN_FILENO);
close(fd2[READ_END]);
printf("going to exec wc\n");
execlp("wc","wc","-w",NULL);
break;
}
else {
//do parenty things
}
}

wait(NULL);
while (1){
wait(NULL);
if(errno== ECHILD) {
printf("all children ended\n");
break;
}
}




close(fd[READ_END]);
close(fd[WRITE_END]);
close(fd2[READ_END]);
close(fd2[WRITE_END]);






return 0;

最佳答案

grepwc永不退出。

为什么?他们永远不会在标准输入上收到 EOF。

为什么?因为,尽管 ls已退出并关闭 pipe(fd) 的写端, 主进程还有 pipe(fd) 的写端打开,因此 pipe(fd) 的读取结束仍在等待更多数据。类似的事情适用于 fd2 : 即使grep退出,wc不会在标准输入上得到 EOF。

解决方案:close等待之前主进程中的所有管道 fds。

关于c - fork 多个进程并让父进程等待所有进程(在 C 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1898386/

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