一、无名管道
1、什么是管道?
管道用于相关进程间的通信,相当于一个传递工具;
1、特点
(1)无名管道是半双工的,在管道的一端只能进行读或者是写,二者不可同时进行;就像水管一样,从管子的一端留入水,另一端流出来,不可以两端同时流入或者流出;
(2)无名管道只能实现在相关的进程间共享数据
(3)使用fork或者execve创建的子进程继承了父进程的文件描述符,可用管道进行共享内存
2、打开和关闭
(1)打开
int pipe( int fd[2] );
//读入或写入数据,管道必须设置fd[2]
若管道建立成功,则打开两个文件描述符,并将值保存在fd[2]这个整数数组中;
注意:
fd[1]用于写入数据,
fd[0]用于读出数据。
若管道建立失败,则返回-1,并且设置errno;
(2)关闭
linux操作系统中,一切皆文件,管道也是文件,成为管道文件(p),所以关闭管道,和关闭文件的方式一样,使用close( ) ;
2、读写管道
和读写文件一样,使用write( )和read( )来实现管道文件写和读;
几乎不会在同一个进程中打开一个管道仅供进程自己使用,管道的本质是用来在进程间交换数据的, 对于一个进程来说,它本来就可以访问自己要通过管道共享的数据,和自己共享数据是没有意义的;
切记:不可以对一个管道的两端同时进行读或者写操作;
3、举个例子
$ vim pipe.c
/pipe.c*
#include<stdio.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>