您好,登錄后才能下訂單哦!
進(jìn)程間通信就是在不同進(jìn)程之間傳播或交換信息,那么不同進(jìn)程之間存在著什么雙方都可以訪問的介質(zhì)呢?進(jìn)程的用戶空間是互相獨(dú)立的,一般而言是不能互相訪問的,唯一的例外是共享內(nèi)存區(qū)。但是,系統(tǒng)空間卻是“公共場所”,所以內(nèi)核顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪問的外設(shè)了。在這個(gè)意義上,兩個(gè)進(jìn)程當(dāng)然也可以通過磁盤上的普通文件交換信息,或者通過“注冊表”或其它數(shù)據(jù)庫中的某些表項(xiàng)和記錄交換信息。廣義上這也是進(jìn)程間通信的手段,但是一般都不把這算作“進(jìn)程間通信”。因?yàn)槟切┩ㄐ攀侄蔚男侍土耍藗儗?duì)進(jìn)程間通信的要求是要有一定的實(shí)時(shí)性。
一.Linux下進(jìn)程間通信的幾種主要手段簡介:
1.管道(Pipe)及有名管道(named pipe):管道可用于具有親緣關(guān)系進(jìn)程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關(guān)系進(jìn)程間的通信;
管道包括三種:1)普通管道PIPE, 通常有種限制,一是半雙工,只能單向傳輸;二是只能在父子進(jìn)程間使用. 2)流管道s_pipe: 去除了第一種限制,可以雙向傳輸. 3)命名管道:name_pipe, 去除了第二種限制,可以在許多并不相關(guān)的進(jìn)程之間進(jìn)行通訊.
2.信號(hào)(Signal):信號(hào)是比較復(fù)雜的通信方式,用于通知接受進(jìn)程有某種事件發(fā)生,除了用于進(jìn)程間通信外,進(jìn)程還可以發(fā)送信號(hào)給進(jìn)程本身;Linux除了支持Unix早期信號(hào)語義函數(shù)sigal外,還支持語義符合Posix.1標(biāo)準(zhǔn)的信號(hào)函數(shù)sigaction(實(shí)際上,該函數(shù)是基于BSD的,BSD為了實(shí)現(xiàn)可靠信號(hào)機(jī)制,又能夠統(tǒng)一對(duì)外接口,用sigaction函數(shù)重新實(shí)現(xiàn)了signal函數(shù));
3.報(bào)文(Message)隊(duì)列(消息隊(duì)列):消息隊(duì)列是消息的鏈接表,包括Posix消息隊(duì)列systemV消息隊(duì)列。有足夠權(quán)限的進(jìn)程可以向隊(duì)列中添加消息,被賦予讀權(quán)限的進(jìn)程則可以讀走隊(duì)列中的消息。消息隊(duì)列克服了信號(hào)承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
4.共享內(nèi)存:使得多個(gè)進(jìn)程可以訪問同一塊內(nèi)存空間,是最快的可用IPC形式。是針對(duì)其他通信機(jī)制運(yùn)行效率較低而設(shè)計(jì)的。往往與其它通信機(jī)制,如信號(hào)量結(jié)合使用,來達(dá)到進(jìn)程間的同步及互斥。
5.信號(hào)量(semaphore):主要作為進(jìn)程間以及同一進(jìn)程不同線程之間的同步手段。
6.套接口(Socket):更為一般的進(jìn)程間通信機(jī)制,可用于不同機(jī)器之間的進(jìn)程間通信。起初是由Unix系統(tǒng)的BSD分支開發(fā)出來的,但現(xiàn)在一般可以移植到其它類Unix系統(tǒng)上:Linux和System V的變種都支持套接字。
二.相關(guān)問題
FAQ1: 管道與文件描述符,文件指針的關(guān)系?
答: 其實(shí)管道的使用方法與文件類似,都能使用read,write,open等普通IO函數(shù). 管道描述符類似于文件描述符. 事實(shí)上, 管道使用的描述符, 文件指針和文件描述符最終都會(huì)轉(zhuǎn)化成系統(tǒng)中SOCKET描述符. 都受到系統(tǒng)內(nèi)核中SOCKET描述符的限制. 本質(zhì)上LINUX內(nèi)核源碼中管道是通過空文件來實(shí)現(xiàn).
FAQ2: 管道的使用方法?
答: 主要有下面幾種方法: 1)pipe, 創(chuàng)建一個(gè)管道,返回2個(gè)管道描述符.通常用于父子進(jìn)程之間通訊. 2)popen, pclose: 這種方式只返回一個(gè)管道描述符,常用于通信另一方是stdin or stdout; 3)mkpipe: 命名管道, 在許多進(jìn)程之間進(jìn)行交互.
FAQ3: 管道與系統(tǒng)IPC之間的優(yōu)劣比較?
答: 管道: 優(yōu)點(diǎn)是所有的UNIX實(shí)現(xiàn)都支持, 并且在最后一個(gè)訪問管道的進(jìn)程終止后,管道就被完全刪除;缺陷是管道只允許單向傳輸或者用于父子進(jìn)程之間.
系統(tǒng)IPC: 優(yōu)點(diǎn)是功能強(qiáng)大,能在毫不相關(guān)進(jìn)程之間進(jìn)行通訊; 缺陷是關(guān)鍵字KEY_T使用了內(nèi)核標(biāo)識(shí),占用了內(nèi)核資源,而且只能被顯式刪除,而且不能使用SOCKET的一些機(jī)制,例如select,epoll等.
FAQ4: WINDOS進(jìn)程間通信與LINUX進(jìn)程間通信的關(guān)系?
答: 事實(shí)上,WINDOS的進(jìn)程通信大部分移植于UNIX, WINDOS的剪貼板,文件映射等都可從UNIX進(jìn)程通信的共享存儲(chǔ)中找到影子.
FAQ5: 進(jìn)程間通信與線程間通信之間的關(guān)系?\
答: 因?yàn)?/span>WINDOWS運(yùn)行的實(shí)體是線程, 狹義上的進(jìn)程間通信其實(shí)是指分屬于不同進(jìn)程的線程之間的通訊.而單個(gè)進(jìn)程之間的線程同步問題可歸并為一種特殊的進(jìn)程通信.它要用到內(nèi)核支持的系統(tǒng)調(diào)用來保持線程之間同步. 通常用到的一些線程同步方法包括:Event, Mutex, 信號(hào)量Semaphore, 臨界區(qū)資源等.
三.進(jìn)程間通信各種方式效率比較
類型 | 無連接 | 可靠 | 流控制 | 記錄 | 消息類型優(yōu)先級(jí) |
普通PIPE | N | Y | Y | N | |
流PIPE | N | Y | Y | N | |
命名PIPE(FIFO) | N | Y | Y | N | |
消息隊(duì)列 | N | Y | Y | Y | |
信號(hào)量 | N | Y | Y | Y | |
共享存儲(chǔ) | N | Y | Y | Y | |
UNIX流SOCKET | N | Y | Y | N | |
UNIX數(shù)據(jù)包SOCKET | Y | Y | N | N |
注:無連接: 指無需調(diào)用某種形式的OPEN,就有發(fā)送消息的能力
流控制: 如果系統(tǒng)資源短缺或者不能接收更多消息,則發(fā)送進(jìn)程能進(jìn)行流量控制
參考自:http://blog.chinaunix.net/uid-21411227-id-1826900.html
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。