我想创建一个小程序,它将接受来自标准输入的用户输入所需的进程数,然后,我的程序将 fork 用户指定的 n 个进程。后来,我想将数据从子级传输到父级。
但是,我只想要一个父进程。我一直在试图找出这个算法,也许我把它弄得太复杂了,但我被困住了。
请注意,我只能使用 C 中的 fork 和管道功能(所以没什么太疯狂的!)
这是我的算法。
仅当我是父进程时才循环,如果我是子进程则不循环。
如果我是进入循环的父进程,那么我将调用fork()。否则,我是一个 child ,我会做一些与 child 相关的任务(稍后我可能会通过管道返回给 parent )。子进程不应重新进入循环,以避免创建子进程的子进程。
这有意义吗?
你建议我做什么?
最佳答案
假设n
是您作为输入获得的子级的数量。让我们看看如果您为每个 child 使用一个管道,您可以做什么。
在父进程中:
pid_t pid;
int fd[n][2];
for(i = 0; i < n; i++) {
pipe(fd[i]);
pid = fork();
if (pid < 0) {
perror("whatever");
exit(1);
}
else if (pid == 0) {
for(j = 0; j < i; j++) {
if (close(fd[j][0]) < 0) {
perror("closing fd[0]");
exit(1);
}
if (close(fd[j][1]) < 0) {
perror("closing fd[1]");
exit(1);
}
}
func(fd[i]);
}
}
// other parent stuff next && close file discriptors not needed
你的 func()
应该是 children 必须做的事情。它采用子管道的 2 个文件描述符作为参数。请注意,在 func
末尾,您应该 exit()
。
为每个 child 创建一个管道的解决方案会好一点,但会比这复杂一点(提示:您可以将 fd 作为参数传递,也要小心关闭所有 fd!)
此外,您可以通过定义 pid_t pid[n];
而不是 pid
来保留每个子进程的 pid
,并将每个 pid 引用为pid[i]
。
别忘了等待每个 child 死去!
关于通过 "fork"为一个父进程创建多个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40731118/