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

本文详细介绍了管道通信的概念及其在操作系统中的应用。包括匿名管道的单工和半双工工作原理、操作方式以及命名管道(FIFO)的特点。通过对比不同类型的管道,帮助读者理解它们之间的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 匿名管道—-单工管道
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指针
标准POSIXANSIC
打开openfopen
关闭closefclose
readfread
writefwrite
定位lseekfseek

三. 匿名管道—-管道复制
1. 文件描述符分类(文件为每个进程创建文件描述符)

分类文件描述符文件号
标准输入STDIN_FILENO0
标准输出STDOUT_FILENO1
标准错误STDERR_FILENO2

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. 特点
可以是非亲缘进程之间,读写必须同时进行,否则阻塞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值