关于IPC
IPC,即Inter-Process Communication(进程间通信)。
我们都知道,进程是一段程序的执行过程,是系统进程资源分配和调度的基本单位。
那么为什么要引入进程间通信呢?或者说,进程间通信能带来哪些好处?
为什么需要IPC?
- 数据传输
- 共享数据
- 通知事件
- 资源共享
- 进程控制
上面几点都很好理解,我们可以着重看一下最后一点:进程控制。
有一些进程希望能够完全控制另一个进程的执行(比如Debug进程),此时控制进程希望能够拦截到另一进程的所有异常,并能够及时知道它的状态改变。
这一点,相信编程过的大家都很有体会吧,我们在写完一段代码,调试程序的时候,打断点、分步执行、进入执行、跳出执行等等,每执行一步,我们可以通过监视器、或者查看内存中的数据来检查程序是否按照我们预想的那样执行,从而发现错误,修正错误。
如果没有进程间通信的话,进程与进程之间你执行你的,我执行我的,井水不犯河水,那么,如何实现调试的功能呢?
IPC的方法?
- 无名管道(pipe)
- 有名管道(fifo)
- 共享内存
- 消息队列
- 信号量
- Socket
今天介绍的重点就是无名管道–pipe。
关于管道
我们都知道每个进程都有自己的4G虚拟地址空间
对于每个进程来说,3G的用户空间是独有的,1G的内核空间是共享的。
基于此,管道本质上就是内核空间中的一块缓存。
对于无名管道而言:
- 必须在关系进程中进程(父子进程或兄弟进程);
- 由
pipe系统调用,管道由父进程建立;
函数原型:
#include <unistd.h>
int pipe(int fields[2])
其中的fields是我们传入的数组,也是一个传出参数。
fields[0]是读端;
fields[1]是写端。
对于命名管道而言:
- 没有任何关系的进程间也可以通信;
- 通过
mkfifo系统调用创建。
关于 " | "
在Linux系统中," | " 就代表了管道。
比如说我们想通过查看Linux系统中的用户信息:
cat /etc/passwd:

我们会看到非常多的信息。
此时,我只想看root用户的信息,该怎么做呢?
cat /etc/passwd | grep root:

对于该命令的解读是:

pipe实现 " | "
通过对上面命令的解读,我们会发现,需要两个子进程,分别做cat和grep的工作,然后将cat的执行结果写入管道,grep从管道中读取内容并且过滤。
注意:
我们通过前面命令可以看到:cat的执行结果是默认输出到屏幕(标准输出)的,而grep的默认读取也是标准输入。
所以,我们为了实现通信,需要将标准输入和标准输出进行重定向(使用dup2()

"本文探讨了进程间通信(IPC)的重要性,特别是无名管道(pipe)的概念。讲解了为何需要IPC,以及它在进程控制中的关键作用。深入解析了无名管道的创建、使用方法,并通过实例展示了如何通过 "|" 符号利用pipe实现Linux命令管道操作。"
最低0.47元/天 解锁文章
1749

被折叠的 条评论
为什么被折叠?



