我需要编写一个简单的程序:将有一个Parent和一些程序[children](在Parent中通过execl
启动)。孩子们以这种方式彼此沟通:孩子我对父母编号J感到厌恶,父母发送消息(类似于 - “有消息给你”)到J,J发送到父母编号K等等。
并且存在问题 - 我的程序(由strace
命令测试)尝试向子项发送消息,并且出现管道错误。
如果有人查看代码并告诉我出了什么问题,我将不胜感激:
以下是代码:
/**
* 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;
}
}
}
答案 0 :(得分:2)
除了你没有用break
(如strager所述)结束你的案件这一事实外,主要问题是陈述l = k;
。请注意,k
是char[20]
,并且在分配给int
时,您不会将k
的任何内容分配给l
。相反,l
将包含指向数组的指针(的值)。你必须在这里做一些不同的事情来获得数组中的值;究竟取决于ucz
发回的内容。
修复此问题并创建自己的ucz
后,该程序似乎没有任何问题。当然,也可能是您的ucz
版本中存在另一个问题。
答案 1 :(得分:0)
关于./ucz - 它需要4个参数 - 第1个 - 玩家数量,第2个玩家数量,第3个 - 从父母读取的描述符数量,第4个 - 写入父母的描述符数量。
添加exit(0),return(0),在exec之后中断(或在“case:0”结尾处)没有帮助。