Linux進(jìn)程間有哪些通信方式?
所謂進(jìn)程間通信就是在不同進(jìn)程之間傳播或交換信息,它是一組編程接口,讓程序員能夠協(xié)調(diào)不同的進(jìn)程,使之能在一個(gè)操作系統(tǒng)里同時(shí)運(yùn)行,并相互傳遞、交換信息;還可以讓一個(gè)程序能夠在同一時(shí)間里處理許多用戶的需求。那么Linux進(jìn)程間的通信方式有幾種?如果你還不清楚,請(qǐng)看下文:
第一種:管道通信
兩個(gè)進(jìn)程利用管道進(jìn)行通信時(shí),發(fā)送信息的進(jìn)程稱為寫進(jìn)程;接收信息的進(jìn)程稱為讀進(jìn)程。管道通信方式的中間介質(zhì)就是文件,通常稱這種文件為管道文件,它就像管道一樣將一個(gè)寫進(jìn)程和一個(gè)讀進(jìn)程連接在一起,實(shí)現(xiàn)兩個(gè)進(jìn)程之間的通信。寫進(jìn)程通過寫入端往管道文件中寫入信息;讀進(jìn)程通過讀出端從管道文件中讀取信息。兩個(gè)進(jìn)程協(xié)調(diào)不斷地進(jìn)行寫和讀,便會(huì)構(gòu)成雙方通過管道傳遞信息的流水線。
第二種:消息緩沖通信
多個(gè)獨(dú)立的進(jìn)程之間可以通過消息緩沖機(jī)制來(lái)相互通信。這種通信的實(shí)現(xiàn)是以消息緩沖區(qū)為中間介質(zhì),通信雙方的發(fā)送和接收操作均以消息為單位。在存儲(chǔ)器中,消息緩沖區(qū)被組織成隊(duì)列,通常稱之為消息隊(duì)列。消息隊(duì)列一旦創(chuàng)建后即可由多進(jìn)程共享,發(fā)送消息的進(jìn)程可以在任意時(shí)刻發(fā)送任意個(gè)消息到指定的消息隊(duì)列上,并檢查是否有接收進(jìn)程在等待它所發(fā)送的消息。若有則喚醒它,而接收消息的進(jìn)程可以在需要消息的時(shí)候到指定的消息隊(duì)列上獲取消息,如果消息還沒有到來(lái),則轉(zhuǎn)入睡眠等待狀態(tài)。
第三種:共享內(nèi)存通信
針對(duì)消息緩沖需要占用CPU進(jìn)行消息復(fù)制的缺點(diǎn),OS提供了一種進(jìn)程間直接進(jìn)行數(shù)據(jù)交換的通信方式。共享內(nèi)存,顧名思義這種通信方式允許多個(gè)進(jìn)程在外部通信協(xié)議或同步,互斥機(jī)制的支持下使用同一個(gè)內(nèi)存段進(jìn)行通信,它是一種最有效的數(shù)據(jù)通信方式,其特點(diǎn)是沒有中間環(huán)節(jié),直接將共享的內(nèi)存頁(yè)面通過附接映射到相互通信的進(jìn)程各自的虛擬地址空間中,從而使多個(gè)進(jìn)程可以直接訪問同一個(gè)物理內(nèi)存頁(yè)面。
進(jìn)程間通信的方式有很多,這里主要講到進(jìn)程間通信的六種方式,分別為:管道、FIFO、消息隊(duì)列、共享內(nèi)存、信號(hào)、信號(hào)量。
管道的特點(diǎn):
管道的原型:
代碼實(shí)現(xiàn):
FIFO,也叫做命名管道,它是一種文件類型。
FIFO的特點(diǎn):
FIFO的原型:
#include #include int mkfifo(const char *pathname, mode_t mode);
其中的 mode 參數(shù)與 open 函數(shù)中的 mode 相同。一旦創(chuàng)建了一個(gè) FIFO,就可以用一般的文件 I/O 函數(shù)操作它。
當(dāng) open 一個(gè) FIFO 時(shí),是否設(shè)置非阻塞標(biāo)志(O_NONBLOCK)的區(qū)別:
代碼實(shí)現(xiàn):
下列代碼有效解決了,當(dāng)管道存在時(shí),程序報(bào)錯(cuò)的問題,減少了無(wú)關(guān)錯(cuò)誤信息的打印。
進(jìn)程間的通信方式:
1.管道(pipe)及有名管道(named pipe):
管道可用于具有親緣關(guān)系進(jìn)程間的通信,有名管道除了具有管道所具有的功能外,它還允許無(wú)親緣關(guān)系進(jìn)程間的通信。
2.信號(hào)(signal):
信號(hào)是在軟件層次上對(duì)中斷機(jī)制的一種模擬,它是比較復(fù)雜的通信方式,用于通知進(jìn)程有某事件發(fā)生,一個(gè)進(jìn)程收到一個(gè)信號(hào)與處理器收到一個(gè)中斷請(qǐng)求效果上可以說(shuō)是一致得。
3.消息隊(duì)列(message queue):
消息隊(duì)列是消息的鏈接表,它克服了上兩種通信方式中信號(hào)量有限的缺點(diǎn),具有寫權(quán)限得進(jìn)程可以按照一定得規(guī)則向消息隊(duì)列中添加新信息;對(duì)消息隊(duì)列有讀權(quán)限得進(jìn)程則可以從消息隊(duì)列中讀取信息。
消息緩沖通信技術(shù)是由Hansen首先提出的,其基本思想是:根據(jù)”生產(chǎn)者-消費(fèi)者”原理,利用內(nèi)存中公用消息緩沖區(qū)實(shí)現(xiàn)進(jìn)程之間的信息交換. 內(nèi)存中開辟了若干消息緩沖區(qū),用以存放消息.每當(dāng)一個(gè)進(jìn)程向另一個(gè)進(jìn)程發(fā)送消息時(shí),便申請(qǐng)一個(gè)消息緩沖區(qū),并把已準(zhǔn)備好的消息送到緩沖區(qū),然后把該消息緩沖區(qū)插入到接收進(jìn)程的消息隊(duì)列中,最后通知接收進(jìn)程.接收進(jìn)程收到發(fā)送里程發(fā)來(lái)的通知后,從本進(jìn)程的消息隊(duì)列中摘下一消息緩沖區(qū),取出所需的信息,然后把消息緩沖區(qū)不定期給系統(tǒng).系統(tǒng)負(fù)責(zé)管理公用消息緩沖區(qū)以及消息的傳遞. 一個(gè)進(jìn)程可以給若干個(gè)進(jìn)程發(fā)送消息,反之,一個(gè)進(jìn)程可以接收不同進(jìn)程發(fā)來(lái)的消息.顯然,進(jìn)程中關(guān)于消息隊(duì)列的操作是臨界區(qū).當(dāng)發(fā)送進(jìn)程正往接收進(jìn)程的消息隊(duì)列中添加一條消息時(shí),接收進(jìn)程不能同時(shí)從該消息隊(duì)列中到出消息:反之也一樣. 消息緩沖區(qū)通信機(jī)制包含以下列內(nèi)容: (1) 消息緩沖區(qū),這是一個(gè)由以下幾項(xiàng)組成的數(shù)據(jù)結(jié)構(gòu): 1、 消息長(zhǎng)度 2、 消息正文 3、 發(fā)送者 4、 消息隊(duì)列指針 (2)消息隊(duì)列首指針m-q,一般保存在PCB中。 (1) 互斥信號(hào)量m-mutex,初值為1,用于互斥訪問消息隊(duì)列,在PCB中設(shè)置。 (2) 同步信號(hào)量m-syn,初值為0,用于消息計(jì)數(shù),在PCB中設(shè)置。 (3) 發(fā)送消息原語(yǔ)send (4) 接收消息原語(yǔ)receive(a)
4.共享內(nèi)存(shared memory):
可以說(shuō)這是最有用的進(jìn)程間通信方式。它使得多個(gè)進(jìn)程可以訪問同一塊內(nèi)存空間,不同進(jìn)程可以及時(shí)看到對(duì)方進(jìn)程中對(duì)共享內(nèi)存中數(shù)據(jù)得更新。這種方式需要依靠某種同步操作,如互斥鎖和信號(hào)量等。
這種通信模式需要解決兩個(gè)問題:第一個(gè)問題是怎樣提供共享內(nèi)存;第二個(gè)是公共內(nèi)存的互斥關(guān)系則是程序開發(fā)人員的責(zé)任。
5.信號(hào)量(semaphore):
主要作為進(jìn)程之間及同一種進(jìn)程的不同線程之間得同步和互斥手段。
6.套接字(socket);
這是一種更為一般得進(jìn)程間通信機(jī)制,它可用于網(wǎng)絡(luò)中不同機(jī)器之間的進(jìn)程間通信,應(yīng)用非常廣泛。
http://blog.csdn.net/eroswang/archive/2007/09/04/1772350.aspx
linux下的進(jìn)程間通信-詳解
詳細(xì)的講述進(jìn)程間通信在這里絕對(duì)是不可能的事情,而且筆者很難有信心說(shuō)自己對(duì)這一部分內(nèi)容的認(rèn)識(shí)達(dá)到了什么樣的地步,所以在這一節(jié)的開頭首先向大家推薦著 名作者Richard Stevens的著名作品:《Advanced Programming in the UNIX Environment》,它的中文譯本《UNIX環(huán)境高級(jí)編程》已有機(jī)械工業(yè)出版社出版,原文精彩,譯文同樣地道,如果你的確對(duì)在Linux下編程有濃 厚的興趣,那么趕緊將這本書擺到你的書桌上或計(jì)算機(jī)旁邊來(lái)。說(shuō)這么多實(shí)在是難抑心中的景仰之情,言歸正傳,在這一節(jié)里,我們將介紹進(jìn)程間通信最最初步和最 最簡(jiǎn)單的一些知識(shí)和概念。 首先,進(jìn)程間通信至少可以通過傳送打開文件來(lái)實(shí)現(xiàn),不同的進(jìn)程通過一個(gè)或多個(gè)文件來(lái)傳遞信息,事實(shí)上,在很多應(yīng)用系統(tǒng)里,都使用了這種方法。但一般說(shuō)來(lái), 進(jìn)程間通信(IPC:InterProcess Communication)不包括這種似乎比較低級(jí)的通信方法。Unix系統(tǒng)中實(shí)現(xiàn)進(jìn)程間通信的方法很多,而且不幸的是,極少方法能在所有的Unix系 統(tǒng)中進(jìn)行移植(唯一一種是半雙工的管道,這也是最原始的一種通信方式)。而Linux作為一種新興的操作系統(tǒng),幾乎支持所有的Unix下常用的進(jìn)程間通信 方法:管道、消息隊(duì)列、共享內(nèi)存、信號(hào)量、套接口等等。下面我們將逐一介紹。