管道简介:
管道是最早的进程间通信方式之一,早在UNIX系统中就存在了,几乎所有的UNIX系统都支持这种方式。
管道有两个限制:
(1) 它们是半双工的。数据只能在一个方向上流动;
(2) 它们只能在具有公共祖先的进程之间使用。
本质上,管道是由内核管理的一个缓冲区,一端连接进程输入,一端连接进程输出,在输出端取出输入端的数据。
管道是由调用pipe函数创建的。
pipe函数声明:
#include <unistd.h>
int pipe(int fd[2]);
功能:创建一个匿名管道
参数说明:
fd:两个文件描述符,其中fd[0]表示读端, fd[1]表示写端。fd[1]的输出是fd[0]的输入。
返回值:成功返回0,失败返回错误代码。
pipe函数使用举例:
程序功能:在子进程中写入数据,在父进程中读取数据。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
/*匿名管道的创建pipe,
在子进程中写入数据,在父进程中读取数据*/
int main()
{
int fd[2];
pid_t child_pid;
char str[] = "hello world!\n";
char readbuf[80];
/*管道的创建*/
pipe(fd);
if ((child_pid = fork()) == -1) {
perror("fork");
exit(1);
}
if (child_pid == 0) {
/*在子进程中,关闭读句柄*/
close(fd[0]);
/*向管道写入数据*/
write(fd[1],str,strlen(str));
exit(0);
} else {
/*在父进程中,关闭管道的写句柄*/
close(fd[1]);
int nbytes = read(fd[0],readbuf,sizeof(readbuf));
printf("received string: %s,%d bytes\n",readbuf,nbytes);
return(0);
}
}
运行结果:
received string: hello world!
,13 bytes
说明:
用fork创建子进程,在子进程中写数据到fd[1]中;在父进程中,从fd[0]读取数据。