pipe和FIFO


首先来看pipe:

pipe用于具有相同祖先的进程(最简单的情况:父子进程)之间的通信。

在进程中调用pipe函数创建管道。这个管道是由内核创建并管理的。
    #include<unistd.h>
    int pipe(intfiledes[2]);

该函数返回一个文件描述符数组fd[], fd[0]用于读管道fd[1]用于写管道。如下图:
pipe <wbr>与 <wbr>FIFO


进程调用fork之后,子进程也会得到这两个文件描述符,且操作的是同一个管道。这样就在父子进程之间建立了通信连接。

若父进程关闭写端f[1],子进程关闭读端f[0],那么就建立了一条子进程到父进程的单向管道。类似地,还可以建立一条父进程到子进程的单向管道。
pipe <wbr>与 <wbr>FIFO


如果父进程在fork之前调用了pipe两次,创建了两条管道,那么可以在之后利用上面的方法建立两条半双工管道,一条从子进程读数据,一条向子进程写数据。这样就相当于建立了父子进程之间的全双工管道。
协同进程(coprocess)就是基于这个方法实现的。



再来看FIFO:

FIFO也叫作命名管道,因此两者本质上还是很相像的。

FIFO不同于pipe的地方:
1)FIFO可以看作高级的管道。它突破了pipe的限制(只能用于同源进程之间的通信), 可以给任意进程之间建立通信连接;
2)FIFO是一个 实际存在于磁盘中的文件;而pipe是由进程创建的,依赖于进程的存活期。

可以调用 mkfifo函数来创建一个FIFO文件。
    #include<sys/stat.h>
    int mkfifo(const char*pathname, mode_t mode);

因为它本质上是一个文件,所以进程用open函数来打开一个FIFO,并在打开时指定文件操作模式(只读,只写还是读写)。之后用read(write)函数来读(写)FIFO

当一个进程以只写方式打开FIFO文件,另一个进程以只读方式打开同一个FIFO文件,这样就建立了两个进程之间的通信管道。




实际工作时,pipe和FIFO基本相同的。下面是两者相同的性质:

1)当读一个写端已经被关闭的pipe(或者是读一个没有为写打开的进程的FIFO)时,在所有数据都被读取后,read返回0,以指示到达了文件结束处
2)当写一个读端已经被关闭的pipe(或者是写一个没有为读打开的进程的FIFO)时,write返回-1,并将errno设置为EPIPE

3)在写pipe或者FIFO时, 常量PIPE_BUF规定了内核中管道缓冲区的大小。如果多个进程同时写一个管道(或者FIFO),要保证写的字节数不大于PIPE_BUF,这样多个写进程的数据不会相互穿插而造成混乱
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值