例子
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#define handle_error(msg) \
{perror(msg);exit(EXIT_FAILURE);}
int main (void)
{
int i = 0;
int pipe_fd[2];
int buf;
setbuf (stdout, NULL);
printf ("parent process(%d) run...\n", getpid());
if (pipe(pipe_fd) == -1)
handle_error("pipe");
for (i = 0; i < 4; i++)
{
int ret_from_fork;
ret_from_fork = fork ();
if (ret_from_fork == -1)
handle_error("fork");
if (ret_from_fork == 0) // child process
{
if (close (pipe_fd[0]) == -1)
handle_error("close");
sleep (i * i);
printf ("child process(%d) closing pipe\n", getpid());
while (1);
if (close (pipe_fd[1]) == -1)
handle_error("close");
_exit (EXIT_SUCCESS);
}
}
while (1);
if (close (pipe_fd[1]) == -1)
handle_error("close");
if (read (pipe_fd[0], &buf, 1) != 0)
perror ("parent read can't get EOF");
printf ("parent process(%d) exited\n", getpid());
return 0;
}
解析
pipe生成的管道,读和写是有锁机制的,也就是当写描述符不close,读请求将一直阻塞。