通过 "fork"为一个父进程创建多个进程

标签 c pipe

我想创建一个小程序,它将接受来自标准输入的用户输入所需的进程数,然后,我的程序将 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/

相关文章:

c - 查找 C 中 N 个案例之间的偶数

C: 尝试实现无名管道

C使用选择并从管道中读取

c - 打印空格数

perl - 从 perl 管道运行 "less"

python - C 和 Python 之间共享变量

Python:同时使用 os.fork()、os.pipe() 和 subprocess.Popen 问题

c - Scanf 在 C 中跳过每隔一个 while 循环

ios - 如何在 Xcode 中使用 C 代码进行优化

计算数据文件中的行数