一、无名管道
无名管道用于有亲缘关系的进程间的通信,管道字如其名,它就像在两个进程之间铺设了一条管道,进程通过管道进行数据交互。无名管道是没有名字的,它由pipe或者pipe2函数创建,与之对应的是有名管道。
1、特点:
(1)创建之后再文件系统中不可见
(2)以半双工的方式进行通信
半双工(Half Duplex)数据传输指数据可以在一个信号载体的两 个方向上传输,但是不能同时传输。
(3)拥有固定的读端(0)和写端(1)
(4)只能用于具有亲缘关系的进程间通信
2、无名管道的创建–pipe
#include <unistd.h>//头文件
int pipe(int pipefd[2]);
参数:
pipefd:存放无名管道读端和写端的数组地址
pipefd[0]--读端
pipefd[1]--写端
返回值:
成功返回0,失败返回-1;
3、无名管道的读写性
(1)读–特性:
<1>写端存在:
管道有数据:返回读到的字节数
管道无数据:阻塞
<2>写端不存在:
管道有数据:返回读到的字节数
管道无数据:返回0
(2)写–特性:
<1>读端存在:
管道有空间:返回写入的字节数
管道无空间:阻塞,直到有空间为止
<2>读端不存在:
无论管道是否有空间,管道破裂
(3)无名管道的大小
我们可以通过一个while循环让它不断写入,当满了时它就会停止写入,这时也就是它的大小。
实例:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int pfd[2]={
0};//定义无名管道数组,只有两个端口,所以大小为2
int ret=pipe(pfd);//pipe--创建无名管道
char buf[1]={
0};//缓冲区大小,每次写入一个
int size,count=0;
while(1)
{
size=write(pfd[1],buf,1);
if(size<0)//write写入不成功就退出,并输出错误原因
{
perror("write");
exit(-1);
}
count=count+size;//循环直到写满
printf("size=%d\n