程序間通訊

2022-02-24 14:53:53 字數 2850 閱讀 1405

程序間通訊(ipc,interprocess communication)是指在不同程序之間傳播或交換資訊。程序間通訊的方式有如下幾種:

特點:

管道只允許具有血緣關係的程序間通訊,如父子程序間的通訊。

它是半雙工的(即資料只能在乙個方向上流動),具有固定的讀端和寫端。

管道並非是程序所有的資源,而是和套接字一樣,歸作業系統所有。可以將它看成檔案系統,但該檔案系統只存在於記憶體當中。

原型

#include /* create a one-way communication channel (pipe).

if successful, two file descriptors are stored in pipedes;

bytes written on pipedes[1] can be read from pipedes[0].

returns 0 if successful, -1 if not. */

extern int pipe (int fd[2]) __throw __wur;

引數的說明:

​ 字元陣列fd是管道傳輸或者接收時用到的檔案描述符,其中fd[0]是接收的時候使用的檔案描述符,即管道出口;而fd[1]是傳輸的時候用到的檔案描述符,即管道入口。

​ 為了使資料可以雙向傳遞,可以使用兩個管道,乙個管道負責程序1的寫和程序2的讀,另乙個管道負責乙個程序1的讀和程序2的寫。測試程式如下:

#include #include #include #include #define buf_size 30

int main()else

return 0;

}

2.fifo

​ fifo即命名管道,在磁碟上有對應的節點,但沒有資料塊—換言之,只是擁有乙個名字和相應的訪問許可權,通過mknode()系統呼叫或者mkfifo()函式來建立的。一旦建立,任何程序都可以通過檔名將其開啟和進行讀寫,而不侷限於父子程序,當然前提是程序對fifo有適當的訪問權。當不再被程序使用時,fifo在記憶體中釋放,但磁碟節點仍然存在。

/* create a new fifo named path, with permission bits mode.  */

extern int mkfifo (const char *__path, __mode_t __mode)

__throw __nonnull ((1));

其中的 mode 引數與open函式中的 mode 相同。一旦建立了乙個 fifo,就可以用一般的檔案i/o函式操作它。

當 open 乙個fifo時,是否設定非阻塞標誌(o_nonblock)的區別:

示例**:乙個程序傳送訊息給另乙個程序

writefifo.cpp

#include #include #include #include #include #include // o_wronly

#include //time

#include using namespace std;

int main()

printf("i am %d process.\n", getpt()); //說明程序的id

if((fd = open("fifo1",o_wronly )) < 0)

for (int i = 0; i < 10; ++i)

sleep(1);

}close(fd);

return 0;

}

readfifo.cpp

#include #include #include #include #include #include // o_wronly

#include //time

#include using namespace std;

int main()

while ((len = read(fd, buf ,1024)) > 0) //讀取fifo管道

close(fd);

return 0;

}

如果在writefifo.cpp中修改如下,設定非阻塞標誌:

if((fd = open("fifo1",o_wronly | o_nonblock)) < 0){   //以只寫方式開啟fifo
如果先執行writefifo,在執行readfifo,則會出錯。

3. 訊息佇列

​ 訊息佇列,就是乙個訊息的鍊錶,是一系列儲存在核心的列表。使用者程序可以向訊息佇列新增訊息,也可以向訊息佇列讀取訊息。

特點:4.共享記憶體

​ 共享記憶體(shared memory),指兩個或多個程序共享乙個給定的儲存區。

5. 訊號量

​ 訊號量是乙個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。

6.套接字

​ 套解口也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同及其間的程序通訊。

程序間通訊的方式——訊號、管道、訊息佇列、共享記憶體

程序間的五種通訊方式介紹

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