gpt4 book ai didi

c - 尝试使用 IFC 管道编写发布者-订阅者关系, fork 太多订阅者

转载 作者:太空宇宙 更新时间:2023-11-04 04:40:17 24 4
gpt4 key购买 nike

我正在尝试编写一个程序,它 fork 一个服务器进程、n 个发布者进程、m 个订阅者进程,为每个发布者和订阅者进程创建一个管道,并监听每个管道上的信息。我做了一些工作,但我不太清楚我需要做什么才能使我编写的代码完整。

有一点肯定是错误的,那就是 fork 的订阅者进程远远超过 m 个。为什么会发生这种情况,我该如何解决?

如有任何建议,我们将不胜感激!

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>

int num_publishers = 0;
int num_subscribers = 0;

int main(int argc, char *argv[])
{
int pfds[2];
char buf[128];

num_publishers = atoi(argv[1]);
num_subscribers = atoi(argv[2]);
printf("%d publishers and %d subscribers.\n", num_publishers, num_subscribers);

pid_t pub_pids[num_publishers];
pid_t sub_pids[num_subscribers];


for (int i=0; i < num_publishers; i++)
{
pub_pids[i] = fork();
printf("Publisher: %d \n", pub_pids[i]);
}

printf("\n");

for (int i=0; i < num_subscribers; i++)
{
sub_pids[i] = fork();
printf("Subscriber: %d \n", sub_pids[i]);
}

printf("\n");

pipe(pfds);


if (!fork())
{
printf("CHILD: writing to the pipe\n");
write(pfds[1], );
printf("CHILD: exiting\n");
exit(0);
}
else
{
printf("PARENT: reading from pipe\n");
read(pfds[0], buf, 5);
printf("PARENT: read \"%s\"\n", buf);
wait(NULL);
}

return 0;

}

最佳答案

简短回答:您的父进程和您的子进程都在产生更多的子进程。

fork() 返回两次 - 一次在父级中,一次在子级中。

如果你是 parent ,你想记录 child 的pid并创建更多的 child 。

如果你是 child ,你想去做一些工作。 (也许 exec() 一些其他可执行文件。)

根据 fork 的返回值来区分它们。

所以:

sub_pids[i] = fork();
if (sub_pids[i] == 0) {
/* child */
... get out of the loop here ...
} else if (sub_pids[i] == -1) {
/* error */
... report the error here ...
} else {
/* parent */
... nothing to do here, just continue the loop ...
}

[edit] 我看到您的代码片段末尾确实有一个看起来正确的 fork() 。也许那部分需要成为一个子程序,从循环中调用。

此外 - 您必须在 fork 之前创建管道。在调用 pipe() 之前你有你的创建循环

关于c - 尝试使用 IFC 管道编写发布者-订阅者关系, fork 太多订阅者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27159661/

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