C 创建n个子对象,每个子对象具有自己的管道

C 创建n个子对象,每个子对象具有自己的管道,c,pipe,fork,pipeline,interprocess,C,Pipe,Fork,Pipeline,Interprocess,我很难理解管道和分叉,至少在实践中实现了它。我想创建n子对象,每个子对象都有自己的管道 我想做一些事情,比如: int main(void) { int fd[2]; for (int i = 0; i < n; i++) { pipe(fd); r = fork(); if (r == 0) { // do child stuff } else if (r > 0) {

我很难理解
管道
分叉
,至少在实践中实现了它。我想创建
n
子对象,每个子对象都有自己的管道

我想做一些事情,比如:

int main(void) {
    int fd[2];
    for (int i = 0; i < n; i++) {
        pipe(fd);
        r = fork();

        if (r == 0) {
            // do child stuff
        } else if (r > 0) {
            // do parent stuff
        }
    }
}
int main(无效){
int-fd[2];
对于(int i=0;i0){
//做父母的事
}
}
}
但是这样做会导致孩子们自己制作过程,而这不是我想要的


此外,您如何使父级和子级同时运行,其中子级不断向管道写入数据,而父级可以访问每个子级的管道,从管道读取数据,并对其执行操作,然后丢弃它,这样子级就可以向管道中写入新的内容了?

您需要一个文件描述符数组,该数组的大小足以容纳每个子级的一对文件描述符

父代码将创建管道。每个子进程都应该关闭任何同级进程的管道。其确切机制取决于如何创建管道;有多种可行的选择

if(r==0)
代码将执行子进程,并应确保它退出而不是继续循环

父进程只需在进入自己的处理循环之前继续创建其他子进程

您需要决定如何确定哪些子级写入了数据,以便父级可以在不阻塞的情况下读取数据。您可以使用
select()
poll()
或其变体,或者父级可以使管道的读取端不阻塞,或者

在一篇评论中,你会问“……人们提到了穿线,但这在管道中可能吗?”,答案是“是的,这是可能的——尽管不清楚这是必要的还是可取的”


您是否碰巧有示例代码执行您所描述的操作

写起来可能比找到更简单。
be_childish()
函数负责完成孩子应该做的任何事情。它不应该回来。如果是,则将报告为失败。 关于子进程的功能,您没有说太多,因此很难填补其中的空白

int main(无效)
{
枚举{NUM_CHILDREN=5};
int fd[NUM_CHILDREN][2];
for(int i=0;i0)
printf(“子%d已退出,状态为0x%.4X\n”,尸体,状态);
返回0;
}

注意:这段代码并没有靠近编译器,更不用说运行了。它可能有bug。

中断
,则在
之后的块中选择code>,或者更可能是
退出()
。我还希望父对象与子对象一起工作。例如,子进程将不断地将随机整数写入其各自的管道,并让父进程在向其写入内容的管道中选择哪个随机数最小。我在网上搜索过,有人提到过穿线,但这在管道上可能吗?“n个孩子,每个人都有自己的管道”。父管道是否保持每个管道的另一端打开,或者子管道M是否连接到子管道M+1,或者。。。?管道的另一端是谁?这将极大地决定循环的结构。父级将只从n个管道中读取,其中每个子级将有一个它只写入的管道。对不起,我不清楚!您是否碰巧有示例代码执行您所描述的操作?我不太清楚你在最后一段中的意思,你指的是什么样的书面资料?如果孩子是独立的,比如随机数生成器,我希望家长通过每个管道查看每个孩子随机生成的数并输出最小的数,那么实现会是什么样子?在我键入代码并提交注释后,我看到了您的其余注释。每个孩子会产生多少随机数?您计划如何通过管道发送它们(二进制数据或可打印数据)?随机数本身是随机的吗?在什么范围内?您会使用哪种伪随机数生成器?重复性是一个问题吗?你用什么做种子?等