0
我想創建一些中國耳語(或電話)遊戲。使用管道連接子進程
我創建了一定數量的子進程,每個子進程必須從字符串中更改1個字母。父進程更改一個字母,然後第一個子進程接受父進程修改的字符串並更改一個字母。第二個孩子接受由第一個孩子修改的字符串(2個字母已經更改)並更改一個,依此類推。
因此,我想通過管道將父母和第一個孩子以及每兩個連續的孩子連接起來。 問題是,這不適用於超過3個孩子。第三個孩子讀不到第二個孩子讀的父母。你能告訴我我做錯了什麼嗎?
int nrch;
nrch=(int) strtol(argv[2], (char **)NULL, 10);
msg=argv[3];
printf("Parent: erhalten: %s\n", msg);
int i=0;
msg=modify(argv[3],nrch);
printf("Parent: weiter: %s\n", msg);
pid_t pids[10];
int fd[2];
int fdold[2];
if (pipe(fdold) == -1) {
error("Can't create the pipe");
}
/* Start children. */
for (i = 0; i < nrch; ++i) {
if (pipe(fd) == -1) {
error("Can't create the pipe");
}
if ((pids[i] = fork()) < 0) {
error("Can't fork process");
}
else if (pids[i] == 0) {
//dup2(fd[0], 0);
if(i==0){
close(fdold[1]);
close(fd[0]);
read(fdold[0],msg,sizeof(msg));
printf("child%d: erhalten: %s\n", (i+1), msg);
msg=modify(msg,i);
printf("child%d: weiter: %s\n", (i+1), msg);
write(fd[1],msg,sizeof(msg));
exit(0);
}
else if(i==(nrch-1)){
close(fdold[1]);
read(fdold[0],msg,sizeof(msg));
printf("child%d: erhalten: %s\n", (i+1), msg);
msg=modify(msg,i);
printf("child%d: weiter: %s\n", (i+1), msg);
printf("child%d: Ende: %s\n", (i+1), msg);
exit(0);
}
else{
close(fdold[1]);
close(fd[0]);
read(fdold[0],msg,sizeof(msg));
printf("child%d: erhalten: %s\n", (i+1), msg);
msg=modify(msg,i);
printf("child%d: weiter: %s\n", (i+1), msg);
write(fd[1],msg,sizeof(msg));
exit(0);
}
}
else{
if(i!=0){
close(fd[1]);
}
else{
write(fdold[1], msg,sizeof(msg));
}
if(i>1){
close(fdold[0]);
}
}
pid_t wpid;
int status;
wpid = wait(&status);
memcpy(fdold,fd,(sizeof(int)*2));
}
close(fd[0]);