程序間通訊的方式有管道、命名管道、訊號、訊息佇列、共享記憶體、訊號量、socket共7種。
一、管道(使用最簡單)
int pipe(fd[2]);
fd[0]->r, fd[1]->r
1.管道是半雙工的,雙方需要通訊時,需要建立兩個管道。
2.管道的實質是乙個核心緩衝區,程序以先進先出的方式從緩衝區訪問資料。
3.該核心緩衝區可以看做是乙個迴圈佇列。緩衝區裡的資料只能被讀一次,讀過之後就不復存在。
4.當管道為空時,讀阻塞,當管道為滿時,寫阻塞。
5.只能用於有血緣關係的程序間通訊。
二、有名管道
mkfifo
1.原理類似於管道,不同的是會建立實際的管道型別檔案『p』,這樣無血緣關係的程序也可進行通訊。
三、訊號(開銷最小)
1.訊號是linux系統中用於程序之間通訊或操作的一種機制,訊號可以在任何時候傳送給某一程序,而無須知道該程序的狀態。如果該程序並未處於執行狀態,則該訊號就由核心儲存起來,知道該程序恢復執行並傳遞給他為止。如果乙個訊號被程序設定為阻塞,則該訊號的傳遞被延遲,直到其阻塞被取消時才被傳遞給程序。
四、訊息佇列
1.訊息佇列的本質就是由核心建立的用於存放訊息的鍊錶,由於是存放訊息的,所以就把這個鍊錶稱為訊息佇列。
2.通訊的程序通過共享同乙個訊息佇列,就能實現程序間通訊。
3.訊息佇列這個鍊錶有很多節點,鍊錶上每乙個節點就是乙個訊息。每個訊息由兩部分組成,分別是訊息編號(訊息型別)和訊息正文。
訊息編號:識別訊息用;訊息正文:真正的資訊內容。
4.訊息佇列與管道通訊相比,其優勢是對每個訊息指定特定的訊息型別,接收的時候不需要按照佇列次序,而是可以根據自定義條件接收特定型別的訊息。
五、共享記憶體
1.共享記憶體允許兩個或多個程序共享乙個給定的儲存區,這一段儲存區可以被兩個或兩個以上的程序對映至自身的位址空間中,就像由malloc()分配的記憶體一樣使用。
2.使用共享記憶體通訊時,程序是直接使用位址來共享讀寫的,而不需要呼叫read、write等函式。
3.乙個程序寫入共享記憶體的資訊,可以被其他使用這個共享記憶體的程序,通過乙個簡單的記憶體讀取讀出,從而實現了程序間的通訊。
4.共享記憶體的效率最高,缺點是沒有提供同步機制,需要使用鎖等其他機制進行同步。
六、訊號量
1.當多個程序/執行緒進行共享操作時,用於資源保護,以防止出現相互干擾的情況,說白了就是用於「資源保護」。
2.訊號量實現互斥:簡單理解的話,訊號量其實是os建立的乙個共享變數,程序在進行操作之前,會先檢查這個變數的值,這個變數的值就是乙個標記,通過這個標記就可以知道可不可以操作,以實現互斥。
3.訊號量是乙個計數器,可以用來控制多個程序對共享資源的訪問。訊號量只有等待和傳送兩種操作。等待(p(sv))就是將其值減一或者掛起程序,傳送(v(sv))就是將其值加一或者將程序恢復執行。
4.訊號量的初值,決定了占用訊號量的執行緒的個數。
七、socket
用的太多了,不說了
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...