全面剖析LINUX開(kāi)源通信
linux下的進(jìn)程通信手段基本上是從Unix平臺(tái)上的進(jìn)程通信手段繼承而來(lái)的。而對(duì)Unix發(fā)展做出重大貢獻(xiàn)的兩大主力AT&T的貝爾實(shí)驗(yàn)室及BSD(加州大學(xué)伯克利分校的伯克利軟件發(fā)布中心)在進(jìn)程間通信方面的側(cè)重點(diǎn)有所不同。前者對(duì)Unix早期的進(jìn)程間通信手段進(jìn)行了系統(tǒng)的改進(jìn)和擴(kuò)充,形成了“system V IPC”,通信進(jìn)程局限在單個(gè)計(jì)算機(jī)內(nèi);后者則跳過(guò)了該限制,形成了基于套接口(socket)的進(jìn)程間通信機(jī)制。Linux則把兩者繼承了下來(lái),如圖示:
其中,最初Unix IPC包括:管道、FIFO、信號(hào);System V IPC包括:System V消息隊(duì)列、System V信號(hào)燈、System V共享內(nèi)存區(qū);Posix IPC包括:Posix消息隊(duì)列、Posix信號(hào)燈、Posix共享內(nèi)存區(qū)。有兩點(diǎn)需要簡(jiǎn)單說(shuō)明一下:
1)由于Unix版本的多樣性,電子電氣工程協(xié)會(huì)(IEEE)開(kāi)發(fā)了一個(gè)獨(dú)立的Unix標(biāo)準(zhǔn),這個(gè)新的ANSI Unix標(biāo)準(zhǔn)被稱為計(jì)算?肪車目梢浦殘圓僮饗低辰緱媯≒SOIX)?,F(xiàn)有大部分Unix和流行版本都是遵循POSIX標(biāo)準(zhǔn)的,而Linux從一開(kāi)始就遵循POSIX標(biāo)準(zhǔn);
2)BSD并不是沒(méi)有涉足單機(jī)內(nèi)的進(jìn)程間通信(socket本身就可以用于單機(jī)內(nèi)的進(jìn)程間通信)。事實(shí)上,很多Unix版本的單機(jī)IPC留有BSD的痕跡,如4.4BSD支持的匿名內(nèi)存映射、4.3+BSD對(duì)可靠信號(hào)語(yǔ)義的實(shí)現(xiàn)等等。
linux下進(jìn)程間通信的幾種主要手段簡(jiǎn)介:
1.管道
管道是進(jìn)程間通信中最古老的方式,它包括無(wú)名管道和有名管道兩種,前者可用于具有親緣關(guān)系進(jìn)程間的通信,即可用于父進(jìn)程和子進(jìn)程間的通信,后者額克服了管道沒(méi)有名字的限制,因此,除具有前者所具有的功能外,它還允許無(wú)親緣關(guān)系進(jìn)程間的通信,即可用于運(yùn)行于同一臺(tái)機(jī)器上的任意兩個(gè)進(jìn)程間的通信。
無(wú)名管道由pipe()函數(shù)創(chuàng)建:
#include
int pipe(int filedis);
參數(shù)filedis返回兩個(gè)文件描述符:filedes[0]為讀而打開(kāi),filedes為寫(xiě)而打開(kāi)。filedes的輸出是filedes[0]的輸入。
在Linux系統(tǒng)下,有名管道可由兩種方式創(chuàng)建:命令行方式mknod系統(tǒng)調(diào)用和函數(shù)mkfifo.下面的兩種途徑都在當(dāng)前目錄下生成了一個(gè)名為myfifo的有名管道:
方式一:mkfifo(“myfifo”,“rw”);
方式二:mknod myfifo p
生成了有名管道后,就可以使用一般的文件I/O函數(shù)如open、close、read、write等來(lái)對(duì)它進(jìn)行操作。
2.消息隊(duì)列
消息隊(duì)列是消息的鏈接表,包括Posix消息隊(duì)列system V消息隊(duì)列。消息隊(duì)列用于運(yùn)行于同一臺(tái)機(jī)器上的進(jìn)程間通信,它和管道很相似,有足夠權(quán)限的進(jìn)程可以向隊(duì)列中添加消息,被賦予讀權(quán)限的進(jìn)程則可以讀走隊(duì)列中的消息。消息隊(duì)列克服了信號(hào)承載信息量少,管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
我們可以用流管道或者套接口的方式來(lái)取代它。