程序間通訊(ipc)是指兩個以上的程序之間傳遞資料。前面提到的同步問題實際上就屬於程序間通訊的問題,只是其資料量很小。程序間通訊的資料量有大有小,根據不同的資料量,各種作業系統都會提供與其相適應的方法。常見的方法有訊息、郵箱、管道、共享記憶體、共享檔案等等。其中訊息、郵箱、管道都屬於先進先出工作方式,而共享記憶體、共享檔案則可以隨機訪問。同步機制的實現大多是採用共享記憶體的方式。
程序間通訊都會涉及同步問題,所以在實際上是出現了用程序間通訊來解決程序間通訊的問題,出現了迴圈引用。不過不要緊,程序間通訊還有乙個粒度的問題,同步問題大多收拾採用系統能處理的最小單位的空間來實現,一般都是乙個位元組,或者乙個機器字長的空間,以保證單條機器指令可以完成操作。換個說法就是用小記憶體來控制大記憶體。
程序間通訊最主要的乙個方式就是保證同一時間內,只有乙個程序能訪問公共變數。簡稱為互斥訪問。
其中訊息、郵箱、管道的執行機制是相同的,都屬於生產者-消費者的問題,只是在處理的資料量方面有區別,訊息一般處理微小資料量的通訊,例如幾個位元組;而郵箱則用於處理資料量較大的通訊,例如幾十個位元組,還可以附帶格式,而管道則是處理大資料量的通訊,所以管道是不限制資料量的。
下面以訊息為例說明程序間通訊執行機制,並給出lenix的實現。
通常的概念中,訊息是直接傳遞給目標的,比如寫個便簽,簡單的幾句話,或者畫個符號。從結構上來說,接受著首先要有乙個地方可以提供給傳送者,用以存放訊息,比如乙個籃子、或者口袋,稍大一點就變成郵箱了。
然後就是,訊息一般只能是接受著才能看,但是任何人都可以向他傳送訊息,只要知道方訊息的地方。
還有一點就是,在籃子或者口袋空的時候,接受者是取不到資料的,必須等待。而籃子或者口袋滿的時候,傳送者也不能傳送訊息,要麼等待到籃子有空位,要麼就直接把訊息給扔了。
在具體的實現過程中,ipc都是採用了乙個全域性緩衝區,傳送者向緩衝區寫資料,接受者從緩衝區讀資料。
lenix訊息機制。
要使用訊息機制,首先要建立訊息物件,lenix對訊息的使用做了一定的限制,只有建立者能接受訊息。
要向接受者傳送資料,首先要獲得訊息物件,lenix提供了按訊息物件名稱查詢的機制。
lenix提供了兩種訊息傳送機制,一種是傳遞,特點是必須傳送成功,也就是如果訊息緩衝區滿的時候,傳送者要等待到緩衝區可用,然後將訊息傳送成功後才返回。一種是投遞,這種方式不一定確保成功,因為在緩衝區滿的時候,並不等待,直接將訊息丟棄,立即返回。
php程序間通訊 yoc PHP程序間通訊
php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...
程序間通訊
實現程序間資料共享除了常用的記憶體檔案對映外,對於一些非檔案的資料共享可以直接使用wm copydata。如果需要在程序a傳遞資料到程序b,簡單的實現如下 在程序a中 cstring strdatatosend t hello 需要傳遞的資料 hwnd hwndreceived 程序b的接收資料視窗...
程序間通訊
最近做專案遇到奇怪的問題,我在主線程中建立乙個工作執行緒。在工作執行緒中用sendmessage向主線程傳送訊息,通知主線程操作office 物件。getactiveobject時提示 hr 0x8001010d 因為應用程式正在傳送乙個輸入同步呼叫,所以無法執行傳出的呼叫。我把sendmessag...