程序間通訊意味著兩個不同程序間可以交換資料,作業系統中應提供兩個程序可以同時訪問的記憶體空間。
基於管道(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...