计算机基础实战课
彭东
网名 LMOS,Intel 傲腾项目关键开发者
19719 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
计算机基础实战课
15
15
1.0x
00:00/00:00
登录|注册

29|应用间通信(一):详解Linux进程IPC

你好,我是 LMOS。
通过前面的学习,我们对进程有了一定的认知,进程之间是独立的、隔离的,这种安排,使得应用程序之间绝对不可以互相“侵犯”各自的领地。
但是,应用程序之间有时需要互相通信,互相协作,才能完成相关的功能。这就不得不由操作系统介入,实现一种通信机制。在这种通信机制的监管之下,让应用程序之间实现通信。Linux 实现了诸如管道、信号、消息队列、共享内存,这就是 Linux 进程 IPC。我们用两节课的时间,分别讨论这些通信机制。这节课,我们先学习管道和信号。
课程的配套代码,你可以从这里下载。

管道

顾名思义,通常管道就是你家一端连接着水池,另一端连着水龙头的、能流通水的东西。在 Linux 中管道作为最古老的通信方式,它能把一个进程产生的数据输送到另一个进程。
比方说,我们在 shell 中输入“ls -al / | wc -l”命令来统计根目录下有多少文件和目录。该命令中的“|”就是让 shell 创建 ls 进程后建立一个管道,连接到 wc 进程,使用 ls 的输出经由管道输入给 wc。由于 ls 输出的是文本行,一个目录或者一个文件就占用一行,wc 通过统计文本行数就能知道有多少目录和文件。
下面我们手动建立一个管道,代码如下所示:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Linux进程间通信(IPC)涉及管道和信号两种通信机制。管道是一种古老的通信方式,能够实现进程间的数据传输和协作。本文通过代码示例和图示清晰地解释了管道的工作原理和使用方法,包括创建、读写规则以及非阻塞状态的设置。此外,还提到了Linux实现的其他进程间通信方式,如消息队列、共享内存等。通过本文的介绍,读者可以快速了解Linux进程间通信的基本概念和实现方式。 另一方面,文章详细介绍了Linux信号的概念和使用方法,以及通过代码示例展示了如何使用信号进行进程间通信。信号作为一种异步事件通知机制,能够打断进程当前正在运行的代码,转而执行另一段代码。通过详细的代码示例和图示,读者可以快速了解信号的基本原理和使用方式。 总的来说,本文通过清晰的解释和实际代码示例,帮助读者快速了解了Linux进程间通信的基本概念和实现方式,以及信号作为一种重要的进程间通信机制的使用方法。这对于需要深入学习和应用IPC的读者来说是一份有价值的技术资料。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《计算机基础实战课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • LockedX
    管道:原理上是通过共享文件来实现的,优点是能够传输任意信息,缺点是只能单向传输 信号:原理上是通过中断来实现的,优点是异步通信并且某些信号可以自定义函数,缺点是只能传递固定的信号

    作者回复: 正确

    2022-10-06归属地:湖北
    2
  • peter
    老师的课很不错啊,请教几个问题: Q1:管道能否用于非父子进程之间的通信? 文中管道例子的两个进程是父子进程,使用了fork。假如两个进程不是通过fork产生的,即不是父子关系,那么,这两个进程可以通过管道通信吗? 注:对于信号,同样存在这个问题:信号能否用于非父子进程之间的通信?(没有用fork) Q2:管道读取端的文件句柄被关闭后,是自动调用write,还是进程调用write时返回0? 文中这句话“如果所有管道写入端对应的文件句柄被关闭,则进程调用 read 时将返回 0;如果所有管道的读取端对应的文件句柄被关闭,则会调用 write,从而产生 SIGPIPE 信号,这可能导致调用 write 进程退出”。 这句话有两个“如果”,前一个“如果”是讲写入端,结果是“read会返回0”。后一个“如果”是讲读取端,感觉应该是对称的啊,对称的话,后半部分应该是“则进程调用 write 时将返回 0”。但文中写的是“则会调用 write”,给人的感觉就是“文件句柄关闭后,即使进程没有调用wirte,也会有个东西自动调用write”。 请问:这里是笔误吗? 假如不是笔误,是谁自动调用write?是内核自动调用吗? Q3:管道内部的缓冲可以设置吗? Q4:应用进程可以给Linux内核发送信号吗? Q5:信号例子的死循环会导致系统卡死吗? 信号例子的代码中,循环代码“while(1) { ;// 死循环防止进程退出 }” ,循环体中什么都没有,没有阻塞,没有等待,会导致系统卡死吗? Q6:Hello OS可以安装在虚拟机上吗? 我正在看老师的另外一门课《操作系统实战45讲》,其中第02课是讲Hello OS的。这个Hello OS是安装在Linux下。我没有专门的Linux电脑,我的笔记本是 win10,用VMWare安装了Ubuntu22虚拟机。请问,Hello OS可以安装在此Ubuntu22虚拟机下吗?

    作者回复: Q1 可以不同的进程 Q2 会发生错误 Q3 可以 Q4 不可以 Q5 不会 Q6 可以 但不能用VMWare

    2022-09-30归属地:湖北
    2
  • 贾献华
    SIGQUIT 应该是 Ctrl+\ 控制吧!

    作者回复: 不好意思可能 是 笔误

    2022-09-30归属地:湖北
    2
    1
  • 苏流郁宓
    管道需要信号调节的(从一个进程数据传输到另一个进程) 在同一时间只允许单向传输(谁是输出方谁是接受方由信号调节决定)?

    作者回复: 管道和信号 没有关系

    2022-09-30归属地:湖北
    1
  • 极客酱酱
    goroutiner 可以实现类似进程通信的机制吗?好像不能获取到goroutiner 的id,那怎么通知呢?

    作者回复: 可以的 有别的方法

    2022-11-02归属地:湖北
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部