IPC(进程间通信)

时间:2024-04-04 08:25:20

为什么需要进程间通信:

进程之间需要进行同步和数据交换

进程间通信跨不过的坎:

进程都要依靠内核来实现彼此之间的同步以及通信。 —— 《Linux 内核》第十九章 进程通信 第一段最后一句。
每个进程各自有不同的用户地址空间,任何一个进程的全局变量,在另一个进程中都看不到,所以进程之间要交换数据必须通过内核。
进程1把数据从用户空间拷贝到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。
IPC(进程间通信)

机制:

通过信号量与其他进程进行同步(信号量)
向其他进程发送消息或者从其他进程接收消息(消息队列)
和其他进程共享一段内存区(共享内存)

IPC 数据结构的创建:

IPC数据结构是在进程请求 IPC 资源(信号量、消息队列或者共享内存区)时动态创建的。

IPC 资源是持久的:

每个 IPC 资源都是持久的:除非被进程显式地释放,否则永远驻留在内存中(直到系统关闭)。

IPC 资源可以由任一进程使用:

包括那些不共享祖先进程所创建资源的进程。

IPC 标识符

由于一个进程可能需要同类型的多个 IPC 资源,因此每个新资源都是使用一个 32 位的 IPC 关键字来标识的。
IPC 标识符由内核分配给 IPC 资源,在系统内部是唯一的,而 IPC 关键字可以由程序员*地选择。
当两个或者更多的进程要通过一个 IPC 资源进行通信时,这些进程都要引用该资源的 IPC 标识符。

使用 IPC 资源

根据新资源是信号量、消息队列还是共享内存区,分别调用 semget()、msgget() 或者 shmget() 函数创建 IPC 资源。
这三个函数的主要目的都是从 IPC 关键字(作为第一个参数传递)中导出相应的 IPC 标识符,进程以后就可以使用这个标识符对资源进行访问。。
如果还没有 IPC 资源和 IPC 关键字相关联,就创建一个新的资源。