IPC(进程间通信)
为什么需要进程间通信:
进程之间需要进行同步和数据交换
进程间通信跨不过的坎:
进程都要依靠内核来实现彼此之间的同步以及通信。 —— 《Linux 内核》第十九章 进程通信 第一段最后一句。
每个进程各自有不同的用户地址空间,任何一个进程的全局变量,在另一个进程中都看不到,所以进程之间要交换数据必须通过内核。
进程1把数据从用户空间拷贝到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。
机制:
通过信号量与其他进程进行同步(信号量)
向其他进程发送消息或者从其他进程接收消息(消息队列)
和其他进程共享一段内存区(共享内存)
IPC 数据结构的创建:
IPC数据结构是在进程请求 IPC 资源(信号量、消息队列或者共享内存区)时动态创建的。
IPC 资源是持久的:
每个 IPC 资源都是持久的:除非被进程显式地释放,否则永远驻留在内存中(直到系统关闭)。
IPC 资源可以由任一进程使用:
包括那些不共享祖先进程所创建资源的进程。
IPC 标识符
由于一个进程可能需要同类型的多个 IPC 资源,因此每个新资源都是使用一个 32 位的 IPC 关键字来标识的。
IPC 标识符由内核分配给 IPC 资源,在系统内部是唯一的,而 IPC 关键字可以由程序员自由地选择。
当两个或者更多的进程要通过一个 IPC 资源进行通信时,这些进程都要引用该资源的 IPC 标识符。
使用 IPC 资源
根据新资源是信号量、消息队列还是共享内存区,分别调用 semget()、msgget() 或者 shmget() 函数创建 IPC 资源。
这三个函数的主要目的都是从 IPC 关键字(作为第一个参数传递)中导出相应的 IPC 标识符,进程以后就可以使用这个标识符对资源进行访问。。
如果还没有 IPC 资源和 IPC 关键字相关联,就创建一个新的资源。