我正在学习pipe
和进程之间的通信,我看到了以下代码来乒乓父进程和子进程之间的一个字节:
int
main(int argc, char **argv)
{
int p[2];
char buf[2];
char *send = "a", *rec = "b";
pipe(p);
int pid = fork();
if(pid == 0){
if(read(p[0], buf, 1) != 1){
fprintf(2, "child failed to read byte from parent.\n");
exit(1);
};
close(p[0]);
printf("%d: received ping\n",getpid());
if(write(p[1], rec, 1) != 1){
fprintf(2, "child failed to send byte to parent.\n");
exit(1);
};
close(p[1]);
exit(0);
} else if(pid > 0){
if(write(p[1], send, 1) !=1){
fprintf(2, "parent failed to send byte to child.\n");
exit(1);
};
close(p[1]);
wait(0);
if(read(p[0], buf, 1) != 1) {
fprintf(2, "parent failed to read byte back from child.\n");
exit(1);
};
close(p[0]);
printf("%d: received pong\n", getpid());
exit(0);
}
else exit(1);
}
这个代码起作用了.然而,在了解到这一点后,
如果没有可用的数据,则管道上的读取将等待写入数据或等待所有文件描述符 指的是要关闭的写入结束;在后一种情况下,读取将返回0,就像 已访问数据文件.
我开始产生了一些怀疑.父进程中的wait(0)
现在似乎是多余的,因为父进程中的read
在子进程写入之前不会运行,这在某种程度上充当了wait()
.
所以,我go 掉了wait(0)
行,代码仍然可以打印"Receied Pong"but no more "received ping",这意味着子元素没有按照预期执行read
.这让我很困惑.