一. 匿名管道—-单工管道
1. 与文件的区别
管道 | 文件 |
---|---|
打开 | popen() |
关闭 | pclose() |
2. 操作
操作 | 命令 |
---|---|
打开 | FILE* popen(const char* cmd,const char* open_mode); |
读 | size_t fread(void* buf,size_t size,size_t num,FILE* stream); |
写 | size_t fwrite(const void* buf,size_t size,size_t count,FILE* stream); |
关闭 | int pclose(FILE* stream); |
3. 本质
启动shell和命令两个进程,从命令进程中读/写文件流
解决exec和system无法返回输出数据的问题
二. 匿名管道—-半双工管道
1. 操作
操作 | 命令 | 特点 |
---|---|---|
创建 | int pipe(int filedes[2]); | 创建出两个文件描述符,0读1写 |
读 | ssize_t write(int fd,const void* buf,size_t count); | |
写 | ssize_t read(int fd,const void* buf,size_t count); | |
控制 | int fcntl(int fd,int cmd,long arg); | 设置或获取文件描述符状态,阻塞或非阻塞,若管道为空,read()默认为阻塞状态 |
关闭 | close(filedes); |
2. 本质
操作 | 文件描述符 | 文件流 |
---|---|---|
数据 | int 整数 | FILE 指针 |
标准 | POSIX | ANSIC |
打开 | open | fopen |
关闭 | close | fclose |
读 | read | fread |
写 | write | fwrite |
定位 | lseek | fseek |
三. 匿名管道—-管道复制
1. 文件描述符分类(文件为每个进程创建文件描述符)
分类 | 文件描述符 | 文件号 |
---|---|---|
标准输入 | STDIN_FILENO | 0 |
标准输出 | STDOUT_FILENO | 1 |
标准错误 | STDERR_FILENO | 2 |
2. 操作及区别
操作 | int dup(int oldfd); | int dup2(int oldfd,int newfd); |
---|---|---|
返回值 | 新的文件描述符 | 最小且尚未使用的文件描述符 |
标准输出 | 复制指针,标准输出为终端 | 复制指针,标准输出被覆盖 |
四. 命名管道—-FIFO管道(半双工)
1. 操作
操作 | 命令 |
---|---|
创建 | int mkfifo(pathname,mode); |
打开 | int open(const char* path,int mode); |
mode:
O_RDONLY
阻塞只读
O_RDONLY|O_NONBLOCK
非阻塞只读
O_WRONLY
阻塞只写
O_WRONLY|O_NONBLOCK
非阻塞只写
2. 特点
可以是非亲缘进程之间,读写必须同时进行,否则阻塞