匿名管道:

管道是一种最基本的IPC机制,由pipe函数创建:
#include <unistd.h>
int pipe(int filedes[2]);

调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端(很好记,就像0是标准输入1是标准输出一样)。

创建管道:

1. 父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。
2. 父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一个管道。

3. 父进程关闭管道读端,子进程关闭管道写端。父进程可以往管道里写,子进程可以从管道里读,管道是用环形队列实现的,数据从写端流入从读端流出,这样就实现了进程间通信。

特点:

1.用于父子进程,有血缘关系的进程;

2.实现进程间的同步与互斥;

3.提供流式服务;

4.生命周期随进程;

5.实现依赖于文件系统;

使用管道需要注意以下4种特殊情况(假设都是阻塞I/O操作,没有设置O_NONBLOCK标志):

  1. 如果所有指向管道写端的文件描述符都关闭了(管道写端的引计数等于0),但仍然有进程 从管道的读端读数据,那么管道中剩余的数据都被读取后,再次read会返回0,就像读到文件末尾一样。

    程序

结果

结果一共输出100行,最后的都是CODE0

2. 如果有指向管道写端的文件描述符没关闭(管道写端的引用计数大于0),持有管道写端的进程也没有向管道中写数据,这时有进程从管道读端读数据,那么管道中剩余的数据都被读取后,再次read会阻塞,直到管道中有数据可读了才读取数据并返回。

3. 如果所有指向管道读端的文件描述符都关闭了(管道读端的引用计数等于0),这时有进程向管道的写端write,那么该进程会收到信号SIGPIPE,通常会导致进程异常终止。

4. 如果有指向管道读端的文件描述符没关闭(管道读端的引用计数大123456于0),持有管道读端的进程也没有从管道中读数据,这时有进程向管道写端写数据,那么在管道被写满时再 次write会阻塞,直到管道中有空位置了才写入数据并返回。

转载于:https://blog.51cto.com/10548202/1825659

匿名管道(4种情况 )相关推荐

  1. 进程间通信(7) “剪贴板“、“匿名管道“、“命名管道“、“邮槽“4种方式总结

    1. 剪贴板和匿名管道只能同一-台机器上 命名管道和邮槽还可以实现跨网络的进程间通信; 邮槽是基于广播通信的,可以一对多的单向通信, 数据量较小,通常都是在424字节以下 命名管道只能点对点的单一的通 ...

  2. 进程通信之二 管道技术第二篇 匿名管道

    上一篇<进程通信之二 管道技术第一篇 输入输出的重定向>示范了增加若干程序代码来完成程序输入输出的重定向,并提出了如果没有程序源代码,只有程序文件如何来完成重定向.本篇就介绍如何使用匿名管 ...

  3. 【Linux系统编程学习】匿名管道pipe与有名管道fifo

    此为牛客Linux C++和黑马Linux系统编程课程笔记. 0. 关于进程通信 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间.任何一个进程的全局变量在另一个进程中都看不到 ...

  4. 管道的概念(匿名管道)

    管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递.调用pipe系统函数即可创建一个管道.管道有如下特质:1.其本质是一个伪文件(实为内核缓冲区),伪文件即不是真正的文件,不占用磁 ...

  5. 进程间通信(匿名管道、命名管道、共享内存)

    进程间通信 进程间通信的作用 管道 匿名管道 命令感受匿名管道 从内核角度去解释匿名管道 代码创建匿名管道 从PCB角度去分析匿名管道 匿名管道的非阻塞读写特性 创建管道,获取管道读写两端文件描述符的 ...

  6. 匿名管道 阻塞_进程间通信-管道

    pipe匿名管道 匿名管道由于没有名字, 因此只能由有亲缘关系的进程使用 #include <unistd.h> int pipe(int fd[2]); 返回: 成功返回0, 出错返回- ...

  7. 进程间通信之匿名管道和命名管道

    目录 管道是什么 匿名管道 命名管道 命名管道创建方式 管道的特点: 管道是什么 概念:管道是计算机通信领域设计者,设计出的一种单向通信的方式,linux原生提供管道通信 管道都是单向传输内容的 管道 ...

  8. Linux系统编程- 无名管道(匿名管道)

    无名管道作为Linux进程间通讯,我们这里把理论和实际结合起来说明. 1.什么是管道 管道,英文位pipe,在学习linux系统编程一个重要概念.它的发明人是道格拉斯.麦克罗伊,这位也是UNIX上早期 ...

  9. C++学习:第六章Linux高级编程 - (七)信号、sigqueue、sigaction、IPC、管道、匿名管道

    回顾: 1. 信号的作用 2. 理解信号: 软中断 可靠与不可靠信号 kill -l 3. 信号发送与注册 kill/raise alarm setitimer signal 4. 信号的屏蔽 sig ...

最新文章

  1. 20Composite(组合)模式
  2. 青源 LIVE 预告 | 华为诺亚韩凯:视觉 Transformer 综述
  3. 【体验】TLD5098EL英飞凌恒流电源开发板,恒定电流源LED驱动板
  4. 【Python基础】Python轻量级循环-列表推导式
  5. [图像处理] 直方图均衡化原理 - 数学推导
  6. 转 ABAP_ALV_Function方式与OO方式(较为简单、普通的ALV)
  7. 温故知新,.Net Core遇见Blazor(FluentUI),属于未来的SPA框架
  8. zabbix网络发现主机
  9. KEIL MDK平台 S3C2440 C语言软件仿真
  10. 操作系统下spinlock锁解析、模拟及损耗分析
  11. 电脑分屏没有声音_Win10笔记本增加双屏显示器及解决没有声音的问题
  12. 我的世界局域网游戏环境搭建
  13. 《我为什么熬夜?》系列之 倚天屠龙记
  14. 冷战时期_从冷战到深度学习的机器翻译历史
  15. 2017春招百度实习生面试记录
  16. 评审人喜欢的国自然基金中英文摘要是怎样的(附模板)
  17. 2017java开发新技术
  18. sheng的学习笔记-设计模式-代理模式
  19. 高以翔猝死事件警示录,劝你熬夜All In的人也许在害你!
  20. SQL如何从字符串截取指定字符(LEFT、MID、RIGHT三大函数)

热门文章

  1. django-celery beat报错 error pid
  2. 21.策略模式(Strategy Pattern)
  3. python---保留两位小数
  4. 在XNA 3.0 项目添加声音——通过Xact播放简单的.wav文件
  5. JavaScript中的面向对象--对象创建
  6. 数据结构笔记(三十五)--排序概念
  7. OSG仿真案例(3)——cmake创建工程
  8. laravel services.php,「Laravel框架中使用Service模式」- 海风纷飞Blog
  9. 计算机二级考试办公室高级应用考点,全国计算机二级考试MSOFFICE高级应用考点解析Word1...
  10. python 去除panda安装包_沉淀,再出发:python中的pandas包