第16章 进程间通信
一个大型的应用软件往往需要众多进程协作,进程间通信(IPC)的重要性显而易见。Linux系统下的进程通信机制基本上是从UNIX平台上的进程通信机制移植而来的。主要的进程间通信机制有以下几种。
q 无名管道(Pipe)及命名管道(Named pipe):管道可用于具有父子关系进程间的通信,命名管道用于无父子关系的进程之间通信。无父子关系的进程可将信息发送到某个命名管道中,并通过管道名读取信息。
q 信号(Signal):信号是进程间高级的通信方式,用于通知其他进程有何种事件发生。此外,进程可以向自身发送信号,还可以获得Linux内核发出的信号。Linux支持UNIX系统早期信号函数sigal(),并从BSD引入了信号函数sigaction()。sigaction()函数不仅提供了更为有效的通信机制,并保持了接口的统一,已替代sigal()函数。
q 报文(Message)队列:报文队列又称为消息队列,是以Posix和System V为标准的通信机制。报文队列克服了信号的数据结构过于简单的问题,同时也解决了管道数据流无格式和缓冲区长度受限等问题。报文队列规定了每个进程的权限,避免了仿冒信息的出现。
q 共享内存:共享内存是让多个进程访问同一个内存空间,适合于数据量极大和数据结构极为复杂的进程间通信。但这种方式牺牲了系统的安全性,所以通常与其他进程间通信形式混合使用,并避免以根用户权限执行。
q 信号量(Semaphore):信号量是用于解决进程的同步和相关资源抢占而设计的。
q 套接字(Socket):套接字是一种数据访问机制,不仅可用于进程间通信,还可用于网络通信。使用套接字最大的好处在于,Linux下的程序能快速移植到其他类UNIX平台上。很多高级的进程间通信机制以套接字为基础实现。
q D-Bus:D-Bus是一种高级的进程间通信机制,以前述机制为基础实现。它提供了丰富的接口和功能,简化了程序设计难度。