我需要编写一个简单的程序:将有一个 Parent 和一些程序 [children](通过 Parent 中的 execl
启动)。 children 以这种方式相互交流:我的 child 向 parent 编号 J 发送消息, parent 向 J 发送一条消息(类似于“有一条消息给你”),J 发送给 parent 编号 K 等等。
还有一个问题——我的程序(通过 strace
命令测试)试图向 child 发送一条消息,但出现了 broken pipe 错误。
如果有人查看代码并告诉我哪里出了问题,我将不胜感激:
代码如下:
/**
* Arbiter zabawy w Losia
*
wersja: Alfa 3b
początek edycji 25.01.2009
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "err.h"
pid_t pid;
FILE *a;
int main ()
{
// my N players
int N;
N = 10;
//write -- writing from parent to child
//read -- reading from child
int rurka_write[N+1][2];
int rurka_read[N+1][2];
//initiation of N players
int i;
for(i = 1; i <= N; i++)
{
//tworze lacza
if (pipe(rurka_write[i]) == -1)
printf("wystapil blad przy rurce %d\n", i);
if (pipe(rurka_read[i]) == -1)
printf("wystapil blad przy rurce %d\n", i);
}
for(i = 1; i <= N; i++)
{
switch(pid = fork())
{
case -1:
printf("wystapil blad przy forkowaniu");
case 0:
printf("potomek numer %d\n", i);
if (close(rurka_write[i][1]) == -1)
printf("zle zamykanie");
if (close(rurka_read[i][0]) == -1)
printf("zle zamykanie");
//closing useless descriptors
int j;
for(j = 1; j <= N; j++)
{
if (j != i)
{
close(rurka_read[j][0]);
close(rurka_read[j][1]);
close(rurka_write[j][0]);
close(rurka_write[j][1]);
}
}
char str_N[20];
char str_i[20];
char str_0[20];
char str_1[20];
sprintf(str_N, "%d", N);
sprintf(str_i, "%d", i);
sprintf(str_0, "%d", rurka_write[i][0]);
sprintf(str_1, "%d", rurka_read[i][1]);
printf("%d Executing execl\n", i);
execl("./ucz", str_N, str_i, str_0, str_1, NULL);
printf("execl executed\n");
// execv("./ucz", str_N, str_i, str_0, str_1, NULL);
//exit(0);
default:
//closing useless pipes
if (close(rurka_read[i][1]) == -1)
printf("zle zamykanie rurki do czytania z potomkna\n");
if (close(rurka_write[i][0]) == -1)
printf("zle zamykanie rurki do pisania do potomka\n");
} //end of switch
} //end of for
//if I am in parent, I'm starting the game
if (pid != 0)
// delay(100);
{
printf("PLAY\n");
int l = 1;
while(l > 0)
{
printf("sending to player %d\n", l);
a = fdopen(rurka_write[l][1], "w");
printf("sending: Wake up");
fprintf(a, "Wake up\n");
printf("flushing");
fflush(a);
char k[20];
printf("reading");
read(rurka_read[l][0], k, 20);
l = k;
}
}
}
最佳答案
除了您没有以 break
结束您的案例这一事实(正如 strager 所指出的),主要问题是语句 l = k;
。请注意,k
是一个 char[20]
,当分配给一个 int
时,您不会分配 的任何内容>k
到 l
。相反,l
将包含指向数组的指针(的值)。你必须在这里做一些不同的事情来获取数组中的值;什么完全取决于 ucz
发回。
修复此问题并制作我自己的 ucz
后,该程序似乎可以正常运行。当然也有可能是你的ucz
版本有问题。
关于linux - C 中的破管道——pipe()、fork()、exec() 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/478555/