考虑下面的代码:如果一个孩子的过程在阅读时不会从写作中关闭管道,会发生什么?
int main(int argc, char *argv[])
{
int pipefd[2];
pid_t cpid;
char buf;
if (argc != 2) {
fprintf(stderr, "Usage: %s \n", argv[0]);
exit(EXIT_FAILURE);
}
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { /* Child reads from pipe */
close(pipefd[1]); /* Close unused write end */
while (read(pipefd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO, "\n", 1);
close(pipefd[0]);
_exit(EXIT_SUCCESS);
} else { /* Parent writes argv[1] to pipe */
close(pipefd[0]); /* Close unused read end */
write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]); /* Reader will see EOF */
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
}
return 0;
}
每当子进程想要从管道中读取,它必须首先从写作关闭该管道的一侧。当我从子进程的if
, 中删除该行close(pipefd[1]);
时,我基本上说“好的,孩子可以从管道读取,但我允许父母同时写入管道”?
如果是这样,当管道打开时,如果读取&时会发生什么情况?没有互斥?
读取()和写入()到管道保证是原子的。 (直到PIPE_BUFF大小)。这意味着:先到先得。书写/阅读部分将交错,但其边界仍然完好无损。 – wildplasser 2012-07-22 10:30:52
如果您不关闭管道的孩子的写入结束,那么孩子将永远不会看到EOF,因为EOF只会在所有用户关闭写入结束时才会显示。有关示例,请参阅http://stackoverflow.com/questions/7868018/last-child-forked-will-not-die。 – ninjalj 2012-07-22 13:37:50