目录
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 --- 打开管道