IPC实现机制(一)---pipe(匿名管道)

一.IPC简介:
(1)概念:
每个进程各⾃有不同的⽤户地址空间,任何⼀个进程的全局变量在另⼀个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟⼀块缓冲区,进程1把数据从⽤户空间拷到内核缓 冲区,进程2再从内核缓冲区把数据读⾛,内核提供的这种机制称为进程间通信
(IPC,InterProcess Communication)
这里写图片描述
(2)常用的进程间通信方式:

  • 传统的进程间通信方式
    无名管道(pipe)、有名管道(fifo)和信号(signal)
  • System v IPC对象
    共享内存(share memory)、消息队列(message queue)和信号量
    C.BSD
  • 套接字(socket)
    本篇文章只讲解pipe(匿名管道)

(3)不同进程间的通信本质:
进程之间可以看到一份公共资源;而提供这份资源的形式或者提供者不同,造成了通信方式不同,而 pipe就是提供这份公共资源的形式的一种。
二.pipe讲解
(1)管道的创建:
管道是最基本的IPC机制;管道的创建由pipe()函数实现:
这里写图片描述
(2)管道具体实现进程间通信过程

  • 父进程创建管道,得到两个⽂件描述符指向管道的两端
  • 父进程fork出子进程,⼦进程继承父进程的文件描述符表,也有两个⽂件描述符指向同⼀管道。
  • 父进程关闭fd[0],子进程关闭fd[1],即⽗进程关闭管道读端,⼦进程关闭管道写端(因为管道只支持单向通信)。⽗进程可以往管道⾥写,⼦进程可以从管道⾥读,管道是⽤环形队列实现的,数据从写端流⼊从读端流出,这样就实现了进程间通信。

    这里写图片描述
    (3)代码实现pipe进程间通信
    这里写图片描述
    (4)使用管道时四种特殊情况(设都是阻塞I/O操作,没有设置O_NONBLOCK标志):

  • 情况一:写端描述符f[1]关闭;读端一直读;
    这里写图片描述

  • 情况二:写端描述符f[1]不关闭,但写端不写;读端一直读;
    这里写图片描述
  • 情况三:读端描述符f[0]关闭;写端一直写;
    这里写图片描述
  • 情况四:读端描述符f[0]不关闭,但读端不读;写端一直写;
    这里写图片描述

总结:
如果一个管道的写端一直在写,而读端的引⽤计数是否⼤于0决定管道是否会堵塞,引用计数大于0,只写不读再次调用write会导致管道堵塞;
如果一个管道的读端一直在读,而写端的引⽤计数是否⼤于0决定管道是否会堵塞,引用计数大于0,只读不写再次调用read会导致管道堵塞;
而当他们的引用计数等于0时,只写不读会导致写端的进程收到一个SIGPIPE信号,导致进程终止,只写不读会导致read返回0,就像读到⽂件末尾⼀样。

(4)管道特点

-1.管道只允许具有血缘关系的进程间通信,如父子进程间的通信。

-2.管道只允许单向通信。

-3.管道内部保证同步机制,从而保证访问数据的一致性。

-4.面向字节流

-5.管道随进程,进程在管道在,进程消失管道对应的端口也关闭,两个进程都消失管道也消失。

(4)求管道的容量大小:
写段一直写,而读段不读,且读段打开;
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值