进程间通信

原理:系统为进程间提供公共传输媒介实现公共访问进而实现通信

通信方式:管道,共享内存,消息队列,信号量

  • 管道

特性:半双工通信  (可选择方向的单向通信)

本质:系统内核中的一块缓冲区(内核空间中开辟的一块内存)

通信原理:多进程只要能够访问同一块内核中的缓冲区(管道)就能实现通信

分类:匿名管道   命名管道

  • 匿名管道:(无标识符,无法被其他进程找到)只能用于具有亲缘关系的进程间通信

无标识符,无法被其他进程找到,只能通过子进程复制父进程的方式获取管道的操作句柄,进行通信

int pipe(int pipefd[2]);  把管道操作当做一个文件操作,通过IO操作完成对管道的操作

pipefd[0]  ->用于从管道读数据

pipefd[1]  ->用于向管道写数据

返回值:成功 0  失败-1

管道读写特性:(匿名与命名特性类似)

  • 如果管道中没有数据,read会阻塞等待数据写入;
  • 如果管道数据满了,则write会阻塞
  • 如果管道的所有读端被关闭了,则继续write就会触发异常,导致进程退出
  • 如果管道的所有写端被关闭了,则read读完管道中所有数据,则不在阻塞,返回0

管道符:|     连接两个命令,将前面命令要输出到标准输出的结果,不再输出到标准输出,而是将这个结果传输到后面命令的进程 (将前面命令结果交给后面命令处理)

ps -ef  |  grep pipe

  1. 创建管道
  2. 创建两个进程,在各自进程中进行程序替换
  3. 程序替换之前,ps进程应该将标准输出重定向到管道写入端。grep进程应该标准输入重定向到管道读取端
  4. 父进程等到子进程退出

代码示例如下:

  • 命名管道:(有标识符)用于同一主机上任意进程间通信

创建一个管道文件:mkfifo   管道文件名  标识符可见于文件系统的管道类型文件,实质上任然是内核中的一块缓冲区

int mkfifo(char* path,int chmod)

代码示例如下:

  • fiforead

  • fifowrite

测试结果如下:

  • 综上总结:

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

分类:

匿名管道:没有标识符,亲缘关系间通信,比如,只能通过子进程复制父进程的方式获取操作句柄

命名管道:标识符就是创建的管道文件,通过打开同一个管道文件访问同一个缓冲区

特性:

  • 半双工通信  可以选择方向的单向通信
  • 管道提供字节流传输服务:有序的,基于连接的,可靠地连接方式

基于连接:所有读端被关闭,则write触发异常,所有写端被关闭则read读完数据返回0,不再阻塞

  • 管道自带同步与互斥

互斥:通过保证同一时间对临界资源(公共缓冲区,即管道)的唯一访问保证操作的安全性

同步:通过某种条件判断,实现对资源访问获取的有序合理性

互斥的具体体现:对管道进行写操作时写入数据大小不超过PIPE_BUF默认4096字节,则保证操作的原子性(原子性即不可再分割)

同步的具体体现:若管道中没有数据则read阻塞,若管道中数据满了则write阻塞

  • 管道生命周期随进程

进程间通信(一)(管道文件操作)相关推荐

  1. (王道408考研操作系统)第二章进程管理-第一节4:进程通信(配合Linux)

    文章目录 一:什么是进程通信 二:如何实现进程间通信及其分类 三:通信方式1-共享存储(共享内存) (1)课本基础内容 (2)补充-Linux中的进程通信 四:通信方式2-管道 (1)管道是什么 (2 ...

  2. linux文件目录和属性知识,Linux文件和目录属性

    文件和目录属性 #ls -l 查看当前目录下的文件 如: drwxr-xr-x  2 root root  4096 12月  4 20:31 111 -rw-r--r--  1 root root ...

  3. linux c语言 ppt,linux操作系统下c语言编程入门.ppt

    linux操作系统下c语言编程入门.ppt Linux操作系统下C语言编程入门 CNT Linux操作系统简介基础知识进程介绍文件操作时间概念消息管理线程操作网络编程Linux下C开发工具介绍 一 L ...

  4. TCP/IP 网络编程 (三)

    server端未处理高并发请求通常採用例如以下方式: 多进程:通过创建多个进程提供服务 多路复用:通过捆绑并统一管理 I/O 对象提供服务 多线程:通过生成和客户端等量的线程提供服务 多进程serve ...

  5. 嵌入式Linux入门11:应用层编程应用和分类

    本文针对Linux系统环境应用层的编程应用做一个概述. 有的人把Linux底层和应用层严格区分对待,在一定程度上是没有错误的.但很多时候需要进行交叉学习.比如,编写了底层驱动程序,如何验证这个驱动能正 ...

  6. Torch7系列教程之Torch深度学习库教程(一)

    Torch7深度学习库教程 写在前面的话 torch库 1 Tensor库 1.1 Tensor数据使用简介 1.2 Tensor构造函数 1.3 作用于Torch上的一些操作函数 2 Storage ...

  7. Windows程序设计最新书籍教程

    <深入浅出Windows API程序设计:编程基础篇> 出版社:人民邮电出版社 书号:978-7-115-56948-6 出版时间:2022-05-01 ◆ 基础篇的内容是学习Window ...

  8. 人工智能专业基础课程

    计算机系统基础(一):程序的表示.转换与链接 课程大纲 01      第一周 计算机系统概述     课时     第1讲 为什么要学习计算机系统基础   第2讲 计算机系统基本组成与基本功能   ...

  9. linux 有名管道FIFO

    linux文件主要有4种:普通文件.目录文件.设备文件(字符设备文件/块设备文件).管道文件 管道文件(p表示管道文件) [redhat@localhost tmp]$ mkfifo fifo [re ...

最新文章

  1. 【Go】Go基础(九):接口(Interfaces)与反射(reflection)
  2. 快速构建Windows 8风格应用6-GridView数据控件
  3. go语言笔记——map map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序...
  4. 编程软件python下载-python 2.7官方版
  5. python的翻译-Python编写简单的谷歌翻译软件
  6. 如何查询电脑的文件系统的分类是哪一种?
  7. Jupyter notebook 运行环境创建和切换 (Win10+Anaconda)
  8. 文巾解题 1646. 获取生成数组中的最大值
  9. python为mysql设置id自增长_postgresql如何设置id自增长
  10. Tomcat 5.0.18 安装配置指南
  11. python数据挖掘与分析实战pdf_《Python数据分析与挖掘实战》PDF+完整源码
  12. Gartner2017年数据科学领域最酷供应商出炉,实至名归
  13. 王思聪吃热狗表情包怎么制作
  14. SketchUp Pro 2018 Mac OS X/Windows 64/32位产品下载
  15. 非接触IC卡读写模块MFRC530的工作原理及其应用
  16. 什么是函数指针 ? 什么是指针函数? int (*P)( ) 和int *p()有什么区别
  17. 第一章-问题求解策略-LA4238-Area of Polycubes
  18. 《简约至上:交互设计四策略》导读
  19. PostgreSQL实战之体系结构
  20. http://nianjian.xiaze.com/tags.php?/%E6%BD%BC%E5%85%B3%E5%B9%B4%E9%89%B4/1/13595315666/

热门文章

  1. go/golang语言编写压力测试
  2. MT6739芯片处理器,MT6739套片开发资料汇集下载
  3. Au 入门系列之四:降噪与修复
  4. 深度学习语音降噪总结
  5. 交叉编译SPECCPU2006
  6. 重读《C primer plus》(七)
  7. 专访 Zipkin 项目 Leader:如何用 Zipkin 做好分布式追踪?
  8. Python编写石头剪刀布的游戏
  9. win10下星际争霸II和Pymarl环境配置
  10. 自定义get方法模板_Zabbix4.0 实现对服务器端口的自定义监控