我正在学习进程间通信,并遇到了下面的示例程序。
在子进程完成写入之前,我不明白阻止父进程尝试读取(作为程序底部的else条件的一部分)是什么
在子进程写入标准输出之前,什么(如果有的话)限制父进程尝试从标准输入读取?
int main(void)
{
int fd[2], nbytes;
pid_t childpid;
char string[] = "Hello, world!\n";
char readbuffer[80];
pipe(fd);
if((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}
if(childpid == 0)
{
/* Child process closes up input side of pipe */
close(fd[0]);
/* Send "string" through the output side of pipe */
write(fd[1], string, (strlen(string)+1));
exit(0);
}
else
{
/* Parent process closes up output side of pipe */
close(fd[1]);
/* Read in a string from the pipe */
nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
printf("Received string: %s", readbuffer);
}
return(0);
}
答案 0 :(得分:1)
在孩子向管道写入任何内容之前,没有任何事情阻止父母开始read()
调用,但父进程在孩子将数据写入管道之前不会获得任何数据(和写入将是原子的,因为它小于管道缓冲区的长度)。父级将挂起,等待一些数据到达管道或管道的每个写入端都要关闭。
请注意,如果读取后nbytes == 0
,则printf()
的输出不确定,因为readbuffer
未初始化。