一、查看命令: man 2 pipe数组
2.头文件:#include <unistd.h>函数
三、函数原型: int pipe(int pipefd[2]);
a、pipefd[2] :无名管道的两个文件描述符,int型的数组,大小为2,pipefd[0]为读端,pipefd[1]为写端
四、返回值:
成功:返回0
失败:返回-1
五、函数特色:
无名管道是最简单的经常使用于一对一的亲缘进程间通讯的方式,既然说是管道,因此能够想象成一条水管,链接两个进程
一个进程负责输入数据,另外一个进程负责接收数据,反过来也同样。spa
六、无名管道的缺点:
a、没有名字,所以没法使用open()打开
b、只能用于亲缘进程间(如父子进程、兄弟进程、祖孙进程等)通讯
c、半双工工做方式,读写端是分开的,pipefd[0]为读端,pipefd[1]为写端
d、写入操做不具备原子性,所以只能用于一对一的简单通讯
e、不能用lseek()来定位code
这是演示代码: #include<stdio.h> #include<unistd.h> #include<errno.h> #include<stdlib.h> #include<wait.h> #include<string.h>
#define LENGTH 50 //字符数组的大小
int main(int argc,char **argv) { int status;//进程退出时用
int pipefd[2];//用于保存无名管道的两个文件描述符,pipefd[0]为读端,pipefd[1]为写端
int ret; pid_t pid; /*建立无名管道,须要在fork()以前建立,这样子进程才能继承无名管道*/ ret = pipe(pipefd); if(ret == -1)//建立失败
{ perror("pipe"); exit(1);//异常退出
} pid = fork();//建立子进程
if(pid != 0)//父进程,负责从无名管道中读取数据
{ wait(&status);//等待子进程退出
char buf[LENGTH]; read(pipefd[0],buf,sizeof(buf));//从无名管道中读取数据,read函数会阻塞
printf("来自子进程的信息: %s",buf); } if(pid == 0)//子进程,负责把数据写入无名管道
{ char buf[LENGTH]; bzero(buf,sizeof(buf));//清空缓冲区
puts("请输入你要发送给父进程的内容:"); fgets(buf,sizeof(buf),stdin); write(pipefd[1],buf,sizeof(buf));//把数据写入无名管道
exit(0);//子进程退出
} close(pipefd[0]);//关闭无名管道中的读端
close(pipefd[1]);//关闭无名管道中的写端
return 0; }