本文关键字: linux进程间通信,linux 进程通信
通过前面的学习,读者已经知道了进程是一个程序的一次执行,是系统资源分配的最小单元。这里所说的进程一般是指运行在用户态的进程,而由于处于用户态的不同进程间是彼此隔离的,就像处于不同城市的人们,他们必须通过某种方式来进行通信,例如人们现在广泛使用的手机等方式。本章将讲述如何建立这些不同的通信方式,就像人们有多种通信方式一样。
Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的。而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间的通信方面的侧重点有所不同。前者是对UNIX早期的进程间通信手段进行了系统的改进和扩充,形成了“System V IPC”,其通信进程主要局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(Socket)的进程间通信机制。而Linux则把两者的优势都继承下来,如图4.1所示。
图4.1 进程间通信发展历程 ● UNIX进程间通信(IPC)方式包括管道、FIFO及信号。 ● System V进程间通信(IPC)包括System V消息队列、System V信号量及System V共享内存区。 ● Posix 进程间通信(IPC)包括Posix消息队列、Posix信号量及Posix共享内存区。
现在在Linux中使用较多的进程间通信方式主要有以下几种。 ● 管道(Pipe)及有名管道(Named Pipe):管道可用于具有亲缘关系进程间的通信。有名管道除具有管道所具有的功能外,还允许无亲缘关系进程间的通信。 ● 信号(Signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的。 ● 消息队列(Messge Queue):消息队列是消息的链接表,包括Posix消息队列和System V消息队列。它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息;对消息队列有读权限的进程则可以从消息队列中读取消息。 ● 共享内存(Shared Memory):可以说这是最有效的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。 ● 信号量(Semaphore):主要作为进程之间及同一进程的不同线程之间的同步和互斥手段。 ● 套接字(Socket):这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。 |