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