程序間通訊API

2021-05-24 01:05:04 字數 1135 閱讀 1752

無名管道

它只能用於具有親緣關係的程序之間的通訊(也就是父子程序或者兄弟程序之間)

它是乙個半雙工的通訊模式,具有固定的讀端和寫端

管道也可以看成是一種特殊的檔案,對於它的讀寫也可以使用普通的read、write等函式。但是它不是普通的檔案,並不屬於其他任何檔案系統,並且只存在於記憶體中。

有名管道

它可以使互不相關的兩個程序實現彼此通訊

該管道可以通過路徑名來指出,並且在檔案系統中是可見的。在建立了管道之後,兩個程序就可以把它當作普通檔案一樣進行讀寫操作。

fifo嚴格地遵循先進先出規則,對管道及fifo的讀總是從開始處返回資料,對它們的寫則把資料新增到末尾,它們不支援如lseek()等檔案定位操作。

有名管道的建立可以使用函式mkfifo,該函式類似檔案中的open操作,可以指定管道的路徑和開啟的模式。

由於普通檔案的讀寫時不會出現阻塞問題,而在管道的讀寫中卻有阻塞的可能,這裡的非阻塞標誌可以在open函式中設定為o_nonblock。

訊號通訊

signal函式

kill函式可以傳送訊號給程序或程序組,它不僅可以中止程序,也可以向程序傳送其他訊號。

與kill函式所不同的是,raise函式允許程序向自身傳送訊號。

alarm()和pause()

共享記憶體

共享記憶體的實現分為3個步驟:

1.建立共享記憶體,這裡用到的函式為shmget,也就是從記憶體中獲得一段共享記憶體區域

2.對映共享記憶體,也就是把這段建立的共享記憶體對映到具體的程序空間中去,這裡使用的函式是shmat。到這裡,就可以使用這段共享記憶體了,也就是可以使用不帶緩衝的i/o讀寫命令對其進行操作。

3.撤銷對映操作,其函式為shmdt。

命令ipcs,用於報告程序間通訊機制狀態的命令,它可以檢視共享記憶體、訊息佇列等各種程序間通訊機制的情況。

訊息佇列

建立或開啟訊息佇列

使用函式msgget,這裡建立的訊息佇列的數量會受到系統訊息佇列數量的限制

新增到訊息佇列

使用函式msgsnd,它把訊息新增到已開啟的訊息佇列末尾

讀取訊息佇列內容

使用函式msgrcv,它把訊息從訊息佇列中取走,與fifo不同的是,這裡可以指定取走某一條訊息

控制訊息佇列

使用函式msgctl

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...