Linux系统编程 | 进程间通信概述

1,177 阅读3分钟

Linux系统编程 | 进程间通信概述

1. 进程间通信的概念

我们知道,在linux环境下,进程与进程之间是相互独立的,每个进程各自都有不同的用户地址空间。一般而言,进程间的进程空间是不能相互访问的。

但在很多情况下,进程与进程之间是需要进程相互通信的,一起来完成某项特定的功能需求。在linux环境下,进程间通信(Inter Process Communication,IPC)是通过内核来完成的。

2. 进程间通信的应用场景

**数据传输:**一个进程需要将它的一个或多个字节的数据发送给另一个进程;

**共享数据:**多个进程共享内存某个数据,任意一个进程修改了共享数据,其它进程相应的会得到更改后的数据;

**通知事件:**一个进程需要向另一个或一组进程发送消息,通知它(们)发生了某种事件(如一个进程向另一个进程发送“终止进程”的信号,对应的进程立即中止)。

**资源共享:**多个进程之间共享同一个资源。通常情况下,为了实现此功能,需要使用到内核所提供锁和同步机制。

**进程控制:**某个进程希望完全控制另一个进程的执行,例如,Debug进程。此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

3. 进程间通信的方式

3.1 管道

管道又分为两种:管道(pipe)及有名管道(named pipe)。而管道又称为无名管道或匿名管道。

管道只能应用于具有血缘关系的进程之间的通信,比如父子进程;

有名管道突破了无名管道只能用于具有血缘关系的进程的限制,它不仅具有无名管道所有功能,还允许无血缘关系的进程间进行通信。

3.2 信号(signal)

信号用于向特定的进程通知有某种事件产生,那个进程根据之前的预设,执行一个具体的函数。信号的语义函数有signal及sigaction,前者比较简单,而后者功能更强大,也更安全。

3.3 信号量(semaphore)

信号量本质是一个计数器,一般将它当作锁机制,来控制多个进程对共享资源的访问。当多个进程,或者同一进程里的多个线程要对某个资源进行访问时,可使用信号量来实现同步。

3.4 消息队列(message queue)

消息队列其实就是一个消息的链表,具有写权限的进程可以往队列里写入消息,而具有读权限的进程可以从队列里读出消息。消息队列比较灵活,比信号承载的信息要多,同时克服了管道缓冲区受限及只能传输无格式字节流的缺点。

3.5 共享内存(shared memory)

这是一种最快的IPC方式,内核在内存里开辟了一块空间,多个进程可以进行访问。正是因为其它的IPC方式速度比较慢,所以才设计了这种通信方式。但为了实现进程间同步及互斥,还需要其它IPC方式,比如信号量,一起配合使用。

3.6 套接字(socket)

这是一种最稳定,最可靠的IPC方式,而且,它不仅可以使用在本机,还可以在不同的机器的进程间实现通信。

更多精彩内容,请关注公众号良许Linux,公众内回复1024可免费获得5T技术资料,包括:Linux,C/C++,Python,树莓派,嵌入式,Java,人工智能,等等。公众号内回复进群,邀请您进高手如云技术交流群。

img