您的位置:首页 > 运维架构 > Linux

linux 进程间通信简介(IPC)

2016-07-21 21:52 489 查看

参考文章

《Linux环境下C编程指南》 杨树青 王欢

IBM developerWorks®上有很棒的说明:

http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html

引文

进程间通信(IPC)是用于处理一个多进程系统中各个进程之间的协调。所谓进程间通信,就是指多个进程之间相互通信,交换信息的方法。常见的进程间通信的方法包括以下几种。

共享内存

信号量

管道

命名管道

消息队列

套接口

全双工管道

其中,共享内存、信号量、消息队列、管道和命名管道只适用于本地进程间通信,套接口和全双工管道则可以用于远程通信,因而一般用于网络编程。

共享内存

共享内存是linux系统中最底层的通信机制,也是最快速的通信机制。共享内存通过两个或多个进程共享同一块内存区域来实现进程间的通信。 通常是由一个进程创建一块共享内存区域,然后多个进程可以对其进行访问,一个进程要传出的数据存放到共享内存中,另一个或多个进程则直接从共享内存中读取数据。因此这种通信方式是最高效的进程间通信方式。但实际的问题在于,当两个或多个进程使用共享内存进行通信时,同步问题的解决显得尤为重要,否则就会造成因不同进程同时读写一块共享内存中的数据而发生混乱。在通常的情况下,通过使用信号量来实现进程的同步。

信号量

信号量是一种用于多个进程访问共享资源进行控制的机制。共享资源通常可以分为两大类:一类是互斥共享资源,即任一时刻只允许一个进程访问该资源;一类是同步共享资源,同一时刻允许多个进程访问该资源。

信号量是为了解决互斥资源的同步问题而引入的机制。简单来说,信号量的实质是整数计数器,其中记录了可供访问的共享资源的单元个数。

当有进程要求使用某一资源时,系统首先要检测该资源的信号量,如果该资源的信号量的值大于0.则进程可以使用这一资源,同时信号量的值减1。进程对资源访问结束时,信号量的值加1。如果该资源的信号量的值等于0,则进程休眠,直至信号量的值大于0时进程被唤醒,访问该资源。

信号量中一种常见的形式是双态信号量。双态信号量对应于只有一个可供访问单元的互斥共享资源,它的初始值被设置为1,任意时刻至多只允许一个进程对资源进行访问。

管道通信(pipe)

在linux系统中,管道是一种特殊的文件,它的主要用途是实现进程间的通信。

管道的一个显著特点是:当一个管道建立后,将获得两个文件描述符,分别用于对管道的读取和写入,通常将其称为管道的写入端和管道的读取端,从写入端写入管道的任何数据都可以从读取端读取。对一个进程来说,管道的写入和读取操作与写入和读取一个普通文件没有区别,只是在内核中通过这种机制来实现进程间的通信。

和前面介绍的共享内存相比,管道机制要稍慢一些,但是管道使用起来比共享内存要方便得多。

管道虽然使用的十分广泛,但也有其固有的局限性。管道智能用于两个进程间的通信,而不能用于多个进程。而且这两个进程要有同源性,即它们必须是最终由同一个进程所派生出的进程。此外,管道是半双工方式的,即只允许单方线传输数据。

命名管道(FIFO)

命名管道(FIFO)又称先入先出队列,是一种特殊的管道,存在于文件系统中。

管道与命名管道的相同点与区别

命名管道可以用于任何两个进程间的通信,而并不限制这两个进程同源,这是与管道最显著的区别,因此命名管道的使用要比管道的使用要灵活得多。

命名管道作为一种特殊的文件存放于文件系统中,而不是像管道一样存放与内核中。当进程对命名管道的使用结束后,命名管道依然存在于文件系统中,除非对其进行删除操作,否则该命名管道不会消失。

命名管道和管道一样,只能用于单向数据传输,如果要用命名管道实现两个进程间数据的相互交换,需要使用两条命名管道。

消息队列

消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问。消息队列与管道很相似,但是用消息队列的好处是对每个消息指定了特定的消息类型,接收消息的进程可以请求接收下一条消息,也可以请求接收下一条特定类型的消息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 进程间通信