【Linux:管道】

进程间通信背景:

每一个进程想要访问物理内存,都是通过访问进程虚拟地址空间当中的虚拟地址进行访问,访问时,通过各自的页表结构,造成了每一个进程和每一个进程的数据独立,由于进程独立性的存在,进程运行时不会相互干扰,但是造成了进程与进程之间相互协作的难点。由此学习进程间通信本质就是为了进程与进程交换数据时使用

进程通信的前提是不同的进程能看见同一份资源 


 进程间通信的方法:

  1. 管道
  2. 共享内存
  3. 消息队列&信号量
  4. 信号

管道符号:| 

ps aux|grep xxx

  ps:本质都是可执行程序

  grep:可执行程序

将ps aux的输出内容通过管道|作为grep xxx的输入内容

 管道的本质:

管道在内核当中是一块缓冲区,供不同的进程进行读写的缓冲区,管道也是一种文件。

管道的接口:

int pipe (int pipefd[2]);

pipefd:数组,输出型参数。

pipefd[0],pipefd[1]是pipe函数进行填充的,参数当中保存的是文件描述符,两个文件描述符分别对应管道的读写两端。

pipefd[0]:管道的读端

pipefd[1]:管道的写端

返回值:0代表创建成功,-1表示创建失败

管道的特性:

  1. 管道是半双工通信的,数据流只能从写端流向读端
  2. 匿名管道在内核创建出来的缓冲区是没有标识符的,导致了其他进程没有办法直接找到这个缓冲区,但是创建的进程可以通过读写两端的文件描述符进行操作
  3. 匿名管道只支持具有亲缘性关系的进程(父子进程)进行进程间通信
  4. 在进行父子进程通信时,父进程先创建管道再创建子进程,此时子进程的文件描述符表中才会有匿名管道的读写两端的描述符 
  5. 当文件描述符保持基础属性(阻塞),一直调用write将管道写满后,write函数就会阻塞
  6. 管道的生命周期是跟随进程的
  7. 管道的通信是面对字节流的,写入与读取的次数并不是一一匹配的

管道的4种情况: 

  1.  如果管道内部是空的,且wirte fd没有关闭,读取条件不具备,那么读进程会阻塞
  2. 管道被写满,且read fd不读并没有被关闭,管道被写满,写进程被阻塞
  3. 管道一直在读且写端关闭,读端返回值会返回0,表示读取到了文件末尾
  4. 读端直接关闭,写端一直在写入,写端进程会被操作系统使用13号信号关闭
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dongliner~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值