我想创建一系列 n 进程 - 一个主人(告诉其他人要做什么)和工作人员做他们被要求的事情。他们之间的沟通是通过使用管道看起来像这样(签署' - '标准管道):主 - 工人1 - 工人2 - ... - 工人n
我的想法是在循环中创建使用fork的子项,然后将所有的prcesses(除了第一个,这将是主人)放在无限循环中,他们将在等待管道中出现的东西。然后他们会做他们应该做的事情(并且如果有必要的话,将命令传递给孩子)并再次等待管道中的某些东西。我认为这个想法很好,但我对这些东西很新(在进程之间进行通信),所以它不起作用。提前感谢您指出错误等等。
这是我的代码(有很多调试打印)。
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;
}