您是否想过两个进程如何在一台设备中进行通信?我猜您想到了使用文件 I/O API 的文件[1],是的,这可以工作,但是在将数据写入受监视文件时发出警报会涉及一定程度的复杂性。您也可以想到网络,这也是可行的。但这将涉及选择端口和设置所有网络恶作剧。所以我们消除了文件 I/O 和网络。我们还能如何让两个进程进行通信呢?在讨论“如何”之前,我们先来谈谈“什么”。两个进程通信意味着什么?这叫什么?
这称为进程间通信(IPC)。您以前可能接触过这个术语。如果你有,也许你对此感到好奇或忽略它(我也经历过)。维基百科将 IPC 定义为“操作系统为进程提供的管理共享数据的机制”。差不多就这样了!本系列文章将讨论基于 Unix 的操作系统提供的不同机制。对不起Windows用户!
无论您是否遇到过这个术语,我敢打赌您已经使用过它们,特别是如果您使用过基于 Unix 的操作系统。当您在您最喜欢的 shell 程序中键入竖线符号 ( |
) 时,您就表明竖线两侧的两个进程进行通信。例如,下面的命令列出了当前目录中的所有文本文件。
ls -l | grep *.txt
它的工作原理是将进程的输入设置grep
为命令的输出ls
。你可以说这ls
是与 通信grep
。这不是很整洁吗?
上面的示例使用了一种称为Pipes 的机制,它通常是大多数用户遇到的第一种 IPC。虽然管道很整洁,但它们需要用户的干预才能实现。如果管道是唯一的通信方式,您需要分发一个 shell 脚本来使您的进程能够进行通信。或者,您需要将进程作为父进程的子进程,并使用pipeline()系统调用来设置它。现在,那不是那么整洁。
如果您希望进程独立、能够通信,但又不想随进程一起分发一些晦涩难懂的 shell 脚本,该怎么办?事实证明,其他 IPC 机制允许您执行所有这些操作。他们是:
文件和 TCP 套接字(我称之为网络)也是 IPC 机制,但我不会讨论这些。它们很熟悉,并且有很多关于它们的文章。eventfd
是另一种机制,但进程不能独立(它们必须在代码中共享一个父进程)。
下一篇文章将介绍命名管道。在那之前,照顾好自己并保持水分!✌
评论已关闭