linux 管道

管道是Unix/Linux系统中的一种进程间通信机制,它通过内核缓冲区实现数据传递。管道分为匿名管道和命名管道,匿名管道主要用于父子进程或兄弟进程之间的单向通信,而命名管道(FIFO)允许不相关进程间通信。管道具有简单易用的特点,但存在数据单向流动、不可反复读取等限制。mkfifo函数用于创建命名管道,而pipe函数用于创建匿名管道。了解管道的使用和限制对于进程间通信至关重要。

管道

管道的特质
  1. 本质是一个伪文件(实质是内核缓冲区)
  2. 由两个文件描述符引用, 一个表示读端, 一个表示写端
  3. 规定数据从管道的写端写入, 读端读出

其原理实则为内核使用环形队列机制, 借助内核缓冲区实现

局限性:

  1. 数据不能由一个进程同时读和写
  2. 不可反复读取管道中的数据, 一旦读走, 则管道将不存在
  3. 采用半双通讯的方式, 数据只能在单方向上流动
  4. 只能在有公共祖先的进程间使用管道

管道的用法

pipe
创建并打开管道
int pipe(int fd[2])
参数:
		fd[0]: 读端
		fd[1]: 写端
返回值:
		成功: 0
		失败: -1

总结

1. 读管道:	
		1. 若有数据, 则read返回实际读到的字节数
		2. 若无数据
				1. 若写端全部被关闭, 则read返回0
				2. 若写端没有被全部关闭, 则read阻塞等待, 让出cpu
				
2. 写管道:
		1. 读端全部被关闭, 进程异常终止(SIGPIPE)
		2. 读端没有全部被关闭:
				1. 管道已满, write阻塞
				2. 管道未满, write将数据写入, 返回实际写入的字节数
		

fpathconf

long fpathconf(int fd, int name);
参数:
		fd: 文件的描述符
		name: 查询的参数
				_PC_PIPE_BUF
				_PC_NAME_MAX
				_PC_LINK_MAX
				_PC_MAX_INPUT
				...

管道的优劣

优点:

	1. 使用简单

缺点:

	1. 只能单向通讯, 双向通讯需要建立两个管道
	1. 只能用于父子, 兄弟进程间的通信

命名管道

mkfifo

int mkfifo(const char *pathname, mode_t mode);
参数:
		pathname: 创建的路径(名字)
		mode: 创建的权限
返回值:
		成功: 0
		失败: -1, 设置 errno
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值