Linux进程间通信
一、概述
我们知道,每个进程创建时有自己独立的4GB空间,有自己的代码段、数据段、堆栈等资源。很多时候,不同的进程间需要交换数据,即相互通信。那么又该通过哪些机子来进行进程间的通信呢?下面我们来一起来看看进程间通信的一些机制。
Linux平台的进程间通信是从Unix平台继承而来,同时也继承了不同流派的一些进程间通信的优点,这样就形成了Linux自己的进程间通信的方式。如下图所示:
二、进程间通信方式
现在Linux中应用比较广泛的进程间通信方式主要有一下几种
- 无名管道(pipe)及有名管道(fifo)
无名管道主要用于具有亲缘关系
进程间的通信(如父子进程);有名管道除了具有和无名管道相似的功能外,它还允许无亲缘关系进程使用。 - 信号(signal)
信号是在软件层次上对中断的一种模拟
,它是比较复杂的通信方式,用于通知进程某事件发生。一个进程和收到一个信号与处理器收到一个中断请求处理的过程类似。 - 消息队列(message queue)
消息队列是消息的连接表,包括POSIX消息队列和System V 消息队列。它克服了两种通信方式中信息量有限的缺点。具有写权限的进程可以按照一定的规则向消息队列中添加新消息;对消息队列有读权限的的进程则可以从消息队列中读取消息。 - 共享内存(shared memory)
可以说这是最有效的进程间通信方式。它使得多个进程可以访问同一块 内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。 - 信号量(semaphore)
主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段。 - 套接字(socket)
这是一种使用广泛的进程间通信机制,它可以用于网络中不同主机之间进程间通信,应用广泛。
三、总结
Linux的进程间通信机制大体可以分为以上的六种,像其他的比如用于应用进程和内核进程间的通信的netlink(本质基于socket),我们这里暂不讨论。
后续,打算写一个系列文章,逐一分析以上六种通信方式,并附上相关的超链接。文章目录如下:
Linux进程间通信 —— (一) 管道
Linux进程间通信 —— (二) 信号
Linux进程间通信 —— (三) 信号量
Linux进程间通信 —— (四) 共享内存
Linux进程间通信 —— (五) 消息队列
[备注] : 本文部分内容整理于网络以及Lixnux相关书籍,加入博主自己的理解以及相关编程实例,力求生动易理解。如有侵权,请联系本人删除。