特点:
1、半双工,数据单向流通。
2、用于具有亲缘关系的进程,如父子进程或者兄弟进程。
3、是一种特殊的文件,存在于内存当中。
1、无名管道的创建
使用函数pipe()来创建一个无名管道
函数原型: int pipe(int fd[2]);
功能:创建一个无名管道
返回值:成功0,失败-1。
参数说明:fd是一个有两个元素的整型数组。表示两个文件描述符,分别代表管道的读端pipefd[0]和写端pipefd[1]。
2、无名管道的使用
对管道的读端fd[0]和写端fd[1]分别进行read和write操作,例如下面的编程练习,在父进程写入了数据,在子进程读取了数据,如此就完成了父子进程间的通信,写入时注意关闭读端,即close(fd[0]),在读取时要关闭写端,即close(fd[1]),fd不能open
3、编程练习
创建一个无名管道,在父进程中写入信息,在子进程读取信息。
#include<stdio.h>
#include <unistd.h>
#include<string.h>
int main()
{
int fd[2];//fd是pipe的参数,分别对应一个文件描述符,都端fd[0],写端fd[1]
if(pipe(fd)==-1){返回 //pipe 返回值成功0,失败-1。
printf("pipe error!\n");
}
char *buf="hello world";
char readbuf[128];
int pid=fork();//在父进程写入了数据,在子进程读取了数据,如此就完成了父子进程间的通信
if(pid>0){
close(fd[0]);//写入前关闭读端
write(fd[1],buf,strlen(buf)+1);//在写端写入了数据
printf("write over \n");
}
else if(pid==0){
close(fd[1]);//读取前关闭写端
read(fd[0],readbuf,strlen(buf)+1);//在读端读取了数据
printf("read over readbuf:%s\n",readbuf);
}
else{
printf("fork defeat\n");
}
return 0;
}