网络编程_进程间通信_管道

来源:互联网 发布:ubuntu route设置 编辑:程序博客网 时间:2024/05/29 04:38

一. 匿名管道—-单工管道
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 fcloseread freadwrite 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. 特点
可以是非亲缘进程之间,读写必须同时进行,否则阻塞

原创粉丝点击