我正在尝试编写一个程序来派生一个服务器进程,n个发布者进程,m个订阅者进程,为每个发布者和订阅者进程创建一个管道,并侦听每个管道上的信息。我已经做了一些工作,但我不太知道我需要做些什么才能使我写的代码完整。
有一件事是绝对错误的,那就是分叉的订阅者进程远远超过了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;
}发布于 2014-11-27 06:09:10
简而言之:您的父进程和子进程都会产生更多的子进程。
fork()返回两次-一次在父进程中,一次在子进程中。
如果您是家长,您希望记录子pid并创建更多的孩子。
如果你是个孩子,你就想去做点事。(可能是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 ...
}编辑我看到你的代码片段的末尾有一个看起来很正确的fork()。也许这部分需要成为一个子例程,从循环中调用。
此外-您必须在派生之前创建管道。在调用pipe()之前,您有您的创建循环
https://stackoverflow.com/questions/27159661
复制相似问题