程序間通訊(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...