C语言中多进程间的通信
我想创建一行n个进程——一个主进程告诉其他进程做什么,另一个进程告诉工人做什么。它们之间的通信是通过管道进行的,看起来像是管道的标志“-”标准:主-工人1-工人2-工人 我的想法是在循环中使用fork创建子进程,然后将除第一个进程之外的所有进程都放在一个无休止的循环中,在这个循环中他们将等待某个东西进入管道。然后,他们会做他们应该做的事情,并在必要时将命令传递给孩子,然后再次等待管道中的东西。我认为这个想法很好,但我对进程之间的通信还很陌生,所以它不起作用。提前感谢您指出问题所在等 这是我的代码,有很多调试打印C语言中多进程间的通信,c,process,pipe,fork,C,Process,Pipe,Fork,我想创建一行n个进程——一个主进程告诉其他进程做什么,另一个进程告诉工人做什么。它们之间的通信是通过管道进行的,看起来像是管道的标志“-”标准:主-工人1-工人2-工人 我的想法是在循环中使用fork创建子进程,然后将除第一个进程之外的所有进程都放在一个无休止的循环中,在这个循环中他们将等待某个东西进入管道。然后,他们会做他们应该做的事情,并在必要时将命令传递给孩子,然后再次等待管道中的东西。我认为这个想法很好,但我对进程之间的通信还很陌生,所以它不起作用。提前感谢您指出问题所在等 这是我的代码
int main(int argc, char* argv[])
{
int i;
int n = atoi(argv[1]);
pid_t pid;
int isMaster = 0;
int order;
int pipeDsc[2][2];
for (i = 0; i < n; i++)
{
if (pipe(pipeDsc[0]) == -1)
error("Error in pipe\n");
if (pipe(pipeDsc[1]) == -1)
error("Error in pipe\n");
switch (pid = fork())
{
case -1:
error("Error in fork\n");
case 0: /*child*/
if (close(pipeDsc[0][1]) == -1)
error("Error in close\n");
if (close(pipeDsc[1][0]) == -1)
error("Error in close\n");
if (i == (n - 1))
exit(0);
break;
default: /*parent*/
if (close(pipeDsc[0][0]) == -1)
error("Error in close\n");
if (close(pipeDsc[1][1]) == -1)
error("Error in close\n");
if (i == 0)
isMaster = 1;
if (i > 0)
{
printf("i=%d, my pid is %d\n", i, getpid());
while (1)
{
if (read(pipeDsc[1][0], &order, sizeof(order)) == -1)
error("Error in read\n");
printf("Received order %d\nMy pid = %d\n\n\n", order, getpid());
switch (order)
{
case 0: /*wait for children to die and die urself*/
if (i == 1)
{
printf("My pid=%d, im out!\n", getpid());
exit(0);
}
else
{
printf("sending further order %d\n", order);
int temp;
temp = order;
if (write(pipeDsc[0][1], &temp,
sizeof(temp)) == -1)
error("Error in write\n");
if (wait(0) == -1)
error("Error in wait\n");
printf("My pid=%d, im out!\n", getpid());
exit(0);
}
default:
error("Unknown order\n");
}
}
}
}
if ((i == 0) && (isMaster == 1))
break;
}
/*
*
* Master code here
*
*/
int temp;
temp = 0;
printf("master here, my pid = %d\n", getpid());
if (write(pipeDsc[0][1], &temp, sizeof(temp)) == -1)
error("Error in master write\n");
printf("Sent order %d\n", temp);
/*****/
return 0;
}
有一个聪明的想法是在60-70年前发明的,叫做“函数”或“子程序”或“方法”。通过使用一些函数,您的代码将得到改进。如果您的代码有11级缩进深度,那么为一些内部代码创建函数几乎总是一个更好的主意;您的孩子们将继续派生更多的进程,但您的父代码处于循环中等待信息。@JonathanLeffler是的,我知道这不是有史以来最漂亮的代码,我肯定会将主代码和订单处理放在函数中。关于那个反向活动-你确定它是错的吗?首先创建流程并转到子部分,在那里关闭不必要的文件描述符,然后作为父级创建另一个子级,然后开始等待信息。否;我不确定这是否是错误的,但如果它是正确的,我不明白你为什么要这么做。我还没有尝试编译代码。@JonathanLeffler这允许我创建一行过程。创建一个进程->子节->关闭一些文件描述符->for循环再次启动->该进程创建一个子节并转到父节,在那里它将等待信息。如果我把等待放在子部分,我就不会得到一行进程。