gpt4 book ai didi

创建 n 个 child ,每个 child 都有自己的管道

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:29 24 4
gpt4 key购买 nike

我无法理解 pipefork,至少在实践中很难理解。我想创建 n 个 child ,每个 child 都有自己的管道。

我想做这样的事情:

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
}
}
}

但这样做会导致 children 自己制作过程,这不是我想要的。

此外,您将如何使父子进程同时运行,其中子进程不断地向管道和父进程写入数据,每个子进程都可以访问管道,从中读取数据,用它做一些事情,然后丢弃它以便 child 可以向管道写入新内容?

最佳答案

您将需要一个文件描述符数组,其大小足以容纳每个 child 的一对文件描述符。

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

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

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

您将需要决定如何确定哪些子级已写入数据,以便父级可以无阻塞地读取数据。您可以使用 select()poll() 或它们的变体,或者父级可能使管道的读取端成为非阻塞的,或者......

在评论中,您问“……人们提到了线程,但管道是否可能?”,答案是“是的,这是可能的——尽管尚不清楚它是否必要或可取”。

Would you happen to have sample code doing what you've described?

写起来可能比找起来简单。 be_childish() 函数负责做 child 应该做的事情。它不应该返回。如果是这样,那将被报告为失败。您没有详细说明子进程的作用,因此很难填补那里的空白。

int main(void)
{
enum { NUM_CHILDREN = 5 };
int fd[NUM_CHILDREN][2];

for (int i = 0; i < NUM_CHILDREN; i++)
{
pipe(fd[i]);
int pid = fork();
if (pid < 0)
…error exit…
if (pid == 0)
{
// Child
// Close sibling pipes
for (int j = 0; j < i; j++)
{
close(fd[j][0]);
close(fd[j][1]);
}
close(fd[i][0]); // Close read end of pipe
be_childish(fd[i][1]);
exit(EXIT_FAILURE);
}
}

for (int i = 0; i < NUM_CHILDREN; i++)
close(fd[i][1]); // Close write end of every child's pipe

// setup complete, unless you need to make the read end of the pipes non-blocking
// do parental stuff, reading from the various child pipes

for (int i = 0; i < NUM_CHILDREN; i++)
close(fd[i][0]); // Close read end of every child's pipe
int corpse;
int status;
while ((corpse = wait(&status)) > 0)
printf("Child %d exited with status 0x%.4X\n", corpse, status);

return 0;
}

注意:此代码尚未接近编译器,更不用说运行了。里面可能有bug。

关于创建 n 个 child ,每个 child 都有自己的管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55129223/

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