首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用IFC管道写入发布者-订阅者关系,派生了太多订阅者

尝试使用IFC管道写入发布者-订阅者关系,派生了太多订阅者
EN

Stack Overflow用户
提问于 2014-11-27 06:01:50
回答 1查看 53关注 0票数 1

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

有一件事是绝对错误的,那就是分叉的订阅者进程远远超过了m个。为什么会发生这种情况?我如何修复它?

任何建议都将不胜感激!

代码语言:javascript
复制
#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;

}
EN

回答 1

Stack Overflow用户

发布于 2014-11-27 06:09:10

简而言之:您的父进程和子进程都会产生更多的子进程。

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

如果您是家长,您希望记录子pid并创建更多的孩子。

如果你是个孩子,你就想去做点事。(可能是exec()或其他一些可执行文件。)

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

所以:

代码语言:javascript
复制
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 ...
}

编辑我看到你的代码片段的末尾有一个看起来很正确的fork()。也许这部分需要成为一个子例程,从循环中调用。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27159661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档