程序間通訊

2021-08-19 21:47:00 字數 2721 閱讀 5833

程序間通訊意味著兩個不同程序間可以交換資料,作業系統中應提供兩個程序可以同時訪問的記憶體空間。

基於管道(pipe)的程序間通訊結構模型:

通過管道完成程序間通訊。管道不是程序的資源,屬於作業系統的。兩個程序通過作業系統提供的記憶體空間進行通訊。

建立管道的函式:

父程序呼叫該函式時建立管道,同時獲取對應於出入口的檔案描述符。父程序的目的是與子程序進行資料交換,因此需要將入口或出口中的1個檔案描述符傳遞給子程序。呼叫fork函式傳遞。

示例:pipe1.c

#include#include#define buf_size 30

int main(int argc, char *argv)

else

return 0;

}

執行結果:

上例中,父子程序都可以訪問管道的i/o路徑,但子程序僅用輸入路徑,父程序僅用輸出路徑。

管道進行雙向資料交換的通訊方式:

示例:pipe2.c

/* 雙向通訊的管道 */

#include#include#define buf_size 30

int main(int argc,char *argv)

else

return 0;

}

執行結果:

在管道中,先通過read函式讀取資料的程序將得到資料。這就是19行使用sleep函式的原因所在。

只用1個管道進行雙向通訊並非易事,需要**並控制執行流程。因此建立2個管道完成雙向通訊,各自負責不同的資料流動即可:

由上圖可知,是用2個管道可以避免程式流程的**或控制。

示例: pipe3.c

/* 雙管道實現程序間通訊 */

#include#include#define buf_size 30

int main(int argc,char *argv)

else

return 0;

}

執行結果:

擴充套件echo_mpserv.c,新增如下功能:

----「將回聲客戶端傳輸的字串按序儲存到檔案中。」

/* 實現併發伺服器端 */

/* echo_storeserv.c */

#include#include#include#include#include#include#include#include#define buf_size 100

void error_handling(char *message)

/* handler */

void read_childproc(int sig)

int main(int argc, char *argv)

act.sa_handler = read_childproc; //設定訊號處理函式

sigemptyset(&act.sa_mask);

act.sa_flags = 0;

state = sigaction(sigchld,&act,0); //子程序終止時呼叫handler

serv_sock = socket(pf_inet,sock_stream,0);

memset(&serv_adr,0,sizeof(serv_adr));

serv_adr.sin_family = af_inet;

serv_adr.sin_addr.s_addr = htonl(inaddr_any);

serv_adr.sin_port = htons(atoi(argv[1]));

if (bind(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr)) == -1)

error_handling("bind() error");

if (listen(serv_sock,5) == -1)

error_handling("listen() error");

pipe(fds);

pid = fork();

if (pid == 0)

fclose(fp);

return 0;

} while (1)

close(clnt_sock);

puts("client disconnected...");

return 0; //呼叫handler

} else //父程序執行區域

close(clnt_sock);

} close(serv_sock);

return 0;

}

執行結果自行測試(可開多個客戶端多程序傳輸,結果儲存在echomsg.txt)

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