程序可以读取管道中的所有数据。但是,程序才停止。它无法继续处理。我认为它停止在儿童过程中。
//I created two pipe before fork (fd[0] and fd[1]).
//child process
if(pid == 0){
close(fd[a][1]);
buf[6];
int i;
while ((i = read(fd[a][0], buf, 6)) > 0) {
printf("%s", buf);
}
close(fd[a][0]);
exit(0);
}
//parent process
write(fd[a][1], "12", 2);
write(fd[a][1], "14", 2);
write(fd[a][1], "15", 2);
write(fd[b][1], "12", 2);
write(fd[b][1], "14", 2);
write(fd[b][1], "15", 2);
printf("done!\n");
close(fd[0][1]);
close(fd[1][1]);
wait(NULL);
printf("Really done!!!\n");
... // The program cannot run after wait(NULL);
--output--
121415done
答案 0 :(得分:0)
这两个进程陷入僵局,每个进程都在等待另一个进程。 您希望子进程停止处理,但它等待父进程,因为它不“知道”父进程不会再发送任何数据。 为了让孩子清楚,请关闭管道的书写端:
write(fd[0][1], "12", 2);
write(fd[0][1], "14", 2);
write(fd[0][1], "15", 2);
printf("done!\n");
close(fd[0][1]);
wait(NULL);
答案 1 :(得分:0)
您在while循环中发出read
,有效阻止自己直到出现问题。如果您需要阅读6
个字符,那么您就可以编写子进程:
char buf[7];
int left = 6;
int so_far = 0; // instead of so_far, (6 - left) could also be used
while (left > 0)
int num_read = read(fd[0][0], buf + so_far, left);
left -= num_read;
so_far += num_read;
}
buf[so_far] = '\0';
printf("%s\n", buf);
答案 2 :(得分:0)
我怀疑你没有在子进程中关闭“写入”fd,因此对read
的调用将阻塞,进而阻止父进程中的wait
。
另外:如果您在问题中省略了某些内容,例如对@ anatolyg答案的回复,您应该编辑问题。这是我最初给出的答案。