Linux---管道的特性总结

进程间的通信 - IPC:操作系统给进程提供的几种通信方式(管道、共享内存、信息队列、信号量)

为什么要给进程提供通信:因为每个进程有自己独立的虚拟空间,访问的都是自己的虚拟地址、因此无法直接通信 ,因此需要操作系统给进程间提供通信方式,通信的场景不同所以也提供了多种不同方式。

管道、共享内存、信息队列、信号量。

原理:操作系统提供了一块所有进程都能访问的空间,就可以通过这块空间实现通信。

管道:用于实现进程间的数据传输。

本质:内核中的一块缓冲区,多个进程通过访问同一块缓冲区是实现通信。

匿名管道 / 命名管道

 

匿名管道:内核中的缓冲区没有标识符 ---- 只能用于具有亲缘关系的进程间通信。

命名管道:内核中的缓冲区具有标识符---可以用于同意主机上的任意进程间通信。

 

程序与运行分为两种状态:用户态、内核态。

用户无法直接访问内核,只能通过系统接口才能访问。

进程无法直访问内核空间中的数据。

 

 

匿名管道:

只能用于具有亲缘关系的进程间通信。

一个进程创建一个管道,操作系统会返回两个文件描述符作为管道的操作句柄,这个管道在内核中没有标识符,因此无法被其他的进程找到,只能通过子进程复制父进程的方式来过去管道的两个操作句柄,通过这方式访问到相同的管道实现通信。

 

具有亲缘关系:只要能够通过父进程获取到管道操作句柄的进程都能进行通信。

 

创建匿名管道: int pipe(int pipefd[2]) --- 创建一个匿名管道,通过参数pipefd向进程返回两个文件描述符作为操作句柄。

pipefd[0] : 用于向管道中读取数据。

pipefd[1] :用于向管道中写入数据。

返回值: 成功返回 0 ; 失败返回 -1。

注意:创建管道一定要在创建子进程之前,只有这样子进程才能复制到父进程中管道的操作句柄。

 

半双工通信:可以选择方向的单向通信。

 

匿名管道的特性:

1.管道中若没有数据,则read继续读取数据就会阻塞 / 若管道中数据满了,则write会阻塞。

阻塞: 为了完成一个功能,发起调用,若当前不具备完成条件,则调用不返回一直等待。

 

1.若管道中所有读端被关闭,则继续write就会触发异常退出进程 / 2.若管道中所有写端被关闭,则继续read在读取完数据不会阻塞,而是返回0。

 

注意:管道的使用 ,最还是不用那一端,就把哪一端关闭掉,避免对程序运行造成影响。

 

 

命名管道:

内核中的一块缓冲区,这块缓冲区具有标识符,能够被其他的进程它通过标识符找到相同的管道,因此可以实现同一个主机上的任意进程间通信,而这个标识符实际上是一个管道文件。

管道文件

管道文件只是一个标识符,实现的通信依然通过内核中的缓冲区完成。

通过打开管道文件获取操作句柄,想要对管道进行什么操作,就以什么方式打开管道文件即可。

 

创建管道文件:

int mkfifo(const char* pathname, mode_t mode);

pathname:管道文件路径名。

mode:管道文件的操作权限,对管道的访问权限也受此影响。

返回值:成功返回0,失败返回-1。

 

命名管道的打开特性:

若命名管道以只读的方式打开,则必须保证管道已经被以写的方式打开,不然就会阻塞,直到管道被以写的打开。

若命名管道以只写的方式打开,则必须保证管道已经被以读的方式打开,不然就会阻塞,直到管道被以读的打开。

注意:管道的缓冲区只有在有读有写的情况下才会被创建

 

管道的特性的总结:(不区分匿名还是命名)

1.管道时半双工通信

2.管道生命周期随进程(在不认为干预关闭的情况下,打开管道的所有进程都退出,管道缓冲区就会被释放)。

3.管道提供字节流传输服务(以字节为传输单元传输方式,并且是先进先出,)。

4.管道自带同步与互斥(实现管道的安全操作,保证操作期间操作被打断,不会出现数据二义性)。

互斥:通过同一时间对临界资源的唯一访问,实现对临界资源访问的安全性。

管道操作数据大小,不超过PIPE_BUF大小,则保证原子性(一次完成,中间不会被打断)。

同步:通过一定的条件判断,不能操作则阻塞进程,实现对资源的访问的合理性。

管道中没有数据read就会阻塞,管道数据写满了write就会阻塞。

5 /1.若管道中所有读端被关闭,则继续write就会触发异常退出进程 / 2.若管道中所有写端被关闭,则继续read在读取完数据不会阻塞,而是返回0。

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值