【发布时间】:2020-09-19 08:58:41
【问题描述】:
如果我的父进程有n 子进程,为什么我不能使用一个管道将父进程的 pid 发送到所有子进程?这在post 中有简要介绍,
但我觉得解释的不是很清楚。
这是我的代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
void main(void){
int n;
printf("How many child processes would you like to create?");
scanf("%d", &n);
pid_t pid, child, ppid, pidout;
int fd[2];
pipe(fd);
for (int i = 0; i < n; i++){
pid = fork();
switch(pid){
case -1:
printf("error forking at index %i", i);
exit(1);
case 0:
close(fd[1]);
child = getpid();
read(fd[0], &pidout, 4);
printf("\nNode : %i\nMy pid is : %i\nMy parent's pid is : %i\n\n", i, child, pidout);
exit(0);
default:
close(fd[0]);
ppid = getpid();
write(fd[1], &ppid, 4);
if (!i){
printf("\nNode : %i, My pid is : %i\n\n", i, ppid);
}
}
}
for (int i = 0; i < n; i++){
wait();
}
}
在这里,我尝试重用相同的管道将数据从父级发送到子级,但在父级的 pid 发送到第一个子级后,管道会中断。我知道解决这个问题的方法是使用n-1 管道:每个通信一个。但是,我不明白为什么这段代码不起作用。任何澄清将不胜感激。谢谢!
【问题讨论】:
-
我喜欢使用
exit(EXIT_FAILURE)和exit(EXIT_SUCCESS)来避免“幻数”。我也不喜欢你如何使用 4 作为幻数 - 它不应该是sizeof(int)吗?