文章目录

  • 前言
  • 一、预备知识
  • 二、管道
  • 匿名管道
    • 测试1
    • 匿名管道的特性总结:
    • 进程间通信代码
    • 测试2
    • 理解命令行管道
  • 命名管道
    • 进程间通信代码
    • 实现两个进程之间的通信
    • 注意事项:
  • 三、共享内存
    • 3.1shmget
    • 3.2shmdt
    • 3.3shmctl
    • 3.4shmat
    • 进程间通信代码
    • Makefile生成
    • 3.4管道 vs 共享内存
    • 3.5shmid vs key
  • 四、消息队列
    • 4.1msgget
    • 4.2msgsnd
    • 4.3msgrcv
    • 4.4msgctl
    • 进程间通信代码
    • 结果:
  • 初识原子性
  • 初识信号量
  • 五、信号量
    • 5.1semget
    • 5.2semctl
    • 5.3semop
    • 进程间通信代码
    • 结果
  • 总结

前言

一、预备知识

1.通信的本质是传递数据,进程间能“直接”传递数据吗?
进程与进程之间要保持独立性,是无法直接传递数据的,所有的数据操作,都会发写时拷贝。

2.两个进程要互相通信,他们就得看到同一份资源,这份资源往往是内存,系统通过某种方式提供的系统内存。

3.两种标准的差异:
System V,主机内通信。
POSIX,主机上的进程能跨网络。

本章讲述的接口都是Sysem V的!!

二、管道


匿名管道

供具有血缘关系的进程,进行进程间通信。(常见于父子)

理论讲解:
父进程以读,写各自打开一次文件(假设pipe_file),然后fork创建子进程,父子进程就都能看到这个pipe_file了。

分析:
子进程拥有独立的pcb,页表,进程地址空间,文件描述符表,但是文件描述表的内容是从父亲继承下来的,也就是文件描述表指向的文件跟父亲相同。

此时下图的3,4号文件描述符可以被父子进程看到。此时一个进程读,一个进程写,就能实现进程间通信。


管道特性:单向通信
管道只能进行单向通信,所以上面只能一端写,一端读,如果又双向通信的需求,建立两个管道。且文件的读写位只有一个,如果要双向通信那么读写位需要两个,这样就完成不了了。
例如ftell返回值一个整数,标识文件指针位置,只有一个进程才能用。

管道文件性质
从上图看,管道也就是文件,只不过它不需要进行持久化保存,打开的文件使用完过后里面的数据不需要真的向磁盘上刷新。

以读写方式打开原因再fork的原因:
父进程假设只读,那么子进程看到的文件也是只读方式,两个只读的无法进行通信。同理两个进程都是写也无法进行通信。
而读写都打开可以让用户层协商谁读谁写,这样更加灵活。

为什么一定要关闭fork后不用的文件描述符
不关闭虽然能跑,但是关闭上能防住误操作,并且语义上也符合管道的属性。

测试1

验证pipe函数的使用
参数为输出型参数,我们外面定义会拿到打开管道文件的描述符。
pipe是帮我们创建一个管道文件的接口,让父子都能够看到这个管道文件,再让用户层协商谁来读谁来写。

fd[0],fd[1]读写记忆方式
close关闭文件描述符,数组下标0是读端,数组下标1是写端。
记忆方式:0想象成嘴巴,读,1像

【Linux】初识进程间通信相关推荐

  1. linux c 进程间通信

    进程间通信概述 进程间通信(InterProcess Communication,IPC)是指在不同进程之间传播或交换信息. Linux的进程间通信方法有管道(Pipe)和有名管道(FIFO).信号( ...

  2. Linux的进程间通信-消息队列

    Linux的进程间通信-消息队列 微博ID:orroz 微信公众号:Linux系统技术 前言 Linux系统给我们提供了一种可以发送格式化数据流的通信手段,这就是消息队列.使用消息队列无疑在某些场景的 ...

  3. Linux环境进程间通信(二): 信号--转载

    http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html http://www.ibm.com/developerworks ...

  4. Linux下进程间通信的六种机制详解

    linux下进程间通信的几种主要手段:        1.管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具 ...

  5. Linux下进程间通信概述

    1. Linux下进程间通信概述 P83-P84 将第一页和第二页合并起来讲了 引言:前面我们学习了一下进程,我们知道多,进程间的地址空间相对独立.进程与进程间不能像线程间通过全局变量通信. 如果想进 ...

  6. Linux环境进程间通信 信号量

    信号量与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制.相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志.除了用于访问控制外,还可用于进程 ...

  7. Linux进程+进程间通信IPC

    一 Linux进程 1) 进程的内存映像 2)解释 BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Bloc ...

  8. 通信开源linux,Linux环境进程间通信

    Linux环境进程间通信(一) http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/index.html Linux环境进程间通信(二): 信 ...

  9. Linux环境进程间通信(五): 共享内存(上)

    Linux环境进程间通信(五): 共享内存(上) 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间. ...

  10. linux实现单机qq_Linux后台服务器开发——Linux下进程间通信的方式有哪些?

    Linux下进程间通信的方式有: 管道 消息队列 信号 信号量 共享存储 套接字 一.管道 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道 PIPE无名管道 详情参阅:ht ...

最新文章

  1. 安卓队列缓存文件,包括断点续传
  2. 人生时间计算器_工具拯救效率,高效拯救人生!70个全国工程人实用小工具+算量表格...
  3. java制作安卓客户端_制作网页的Android客户端(一)
  4. vue data数据修改_Vue 超清晰思维导图(7张),详细知识点梳理!
  5. LeetCode 二叉树、N叉树的最大深度与最小深度(递归解)
  6. 为什么招聘高级前端开发这么难?
  7. 计算机课教案学法,计算机应用基础教学方法初探
  8. [AutoVue开发手册]第二篇——AutoVue之Applet参数列表
  9. 完整的模型测试(deom)步骤
  10. win7_64位下部署Apache+Mysql5.7.19+Php7+Snipe-IT
  11. 根据行数要求实现展开与隐藏TextView
  12. 携程面试官问我怎么划分 Java 虚拟机内存区域,相见恨晚!
  13. echart 三维可视化地图_可视化地图是什么?推荐3个工具!
  14. 二十四节气-白露 | 白露至,秋实美
  15. 小程序基础开发(五):微信支付全套流程
  16. 软件质量控制与测试方案,文思海辉金融质量控制与测试解决方案,定义行业新高度...
  17. java用泰勒公式写余弦值_数学基础系列(三)----第一中值定理、微积分基本定理、牛莱公式、泰勒公式...
  18. 帮助粉丝用青泥学术大数据推荐毕业论文选题(围绕 教育信息化2.0、疫情期间线上学习质量问题、Steam教育、智慧教育等突破点来抉择)
  19. 【小算法】二分图匹配之匈牙利算法详解(图例说明,代码亲测可用)
  20. 旧书交易系统——第二次报告(UML图)

热门文章

  1. 宇文成 Python 第六章 列表和元组
  2. 范数、范数球(整理)
  3. Windows 上安装 PostgreSQL教程
  4. PM971 BGA佑华烧录器 BGA NVMe SSD专用拷贝机 NVMe SSD烧录机
  5. system()与WIFEXITED/WEXITSTATUS/WIFSIGNALED
  6. Stream流reduce方法
  7. beach rally java_小三自带beach rally赛车游戏心得
  8. java基本集合源码解读-JDK8/11
  9. InlineHOOK
  10. MySQL:Ubuntu安装并简单配置MySQL