进程间通信---管道

目录

1. 无名管道

1.1 创建

1.2 特性

2.命名管道

2.1 创建和删除

2.2 特点

3. 命名管道 VS 有名管道

4. 标准流管道

4.1 popen定义

4.2 popen操作

4.3 fopen、open和popen


1. 无名管道

1.1 创建

int pipe(int fildes[2]);

1.2 特性

① 有固定的数据流向 --- fd[1] 写端,fd[0] 读端,通信方式为半双工;

② 只能在有亲缘关系的进程之间进行通信(管道是在.c内创建的);

③ 无名管道是内核维护的缓冲区,生存周期有限;

④ 基于字节流通信,数据没有边界,可以多次写入,一次全部读取;

⑤ 管道的写端关闭,read时不会阻塞,返回值为0;

⑥ 管道的读端关闭,write时写管道会受到系统发送的13号信号SIGPIPE终止进程

2.命名管道

2.1 创建和删除

int mkfifo(const char *pathname, mode_t mode);
//管道名 权限
int unlink(const char *path);
//unlink删除文件时会检查他的引用计数
//若引用计数不为0,则删除该文件的软链接并将引用计数-1
//直至引用计数为0时,删除管道文件

2.2 特点

① 可以进行非亲缘关系的进程间通信;

② 是特殊文件,不会随着进程的终止而消亡;

③ 一端建好而另一端没有建好时,阻塞;

④ 管道为空时read,进程阻塞。

3. 命名管道 VS 有名管道

无名管道有名管道
创建int pipe(int fildes[2])int mififo(pathname, mode)
使用只能用于有亲缘关系的进程间可用于非亲缘关系的进程间
本质内核维护的缓冲区特殊文件
生存周期有限,会随进程的终止而消亡不会随进程终止而消亡

4. 标准流管道

4.1 popen定义

FIFE *popen(const char* command, const char* type);
//失败返回NULL
//command: 指向命令字符串的指针
//type: "w" | "r"

4.2 popen操作

popen是对以下操作的封装:

① 创建一条管道;

② fork出一个子进程;

③ 关闭不需要使用的文件描述符;

④ 调用exec函数族;

⑤ 执行函数中的命令。

4.3 fopen、open和popen

fopen  ---  打开普通文件,通过缓冲区来操作,读写都在缓冲区上

open   ---  打开设备文件,直接操作物理设备,如磁盘、设备文件等

popen ---  打开管道

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值