關於程序間通訊的總結

2021-09-11 06:18:11 字數 1954 閱讀 5461

程序間通訊的幾種方法

1 檔案(效率低,基本不使用)

2 管道 (在檔案的基礎上改進的方式)

3 訊號 (效率較高,但是傳輸資料不方便,只能傳輸整形數,有點像中斷)

4 ipc通訊(訊息佇列和共享記憶體)

訊號量(不負責通訊,只負責保護通訊時的安全,也是ipc)

管道通訊

無名管道:只用於父子程序之間的通訊。

有名管道:可用於不同程序之間的通訊。(也可以用於父子之間)

管道檔案不是可以無窮寫入的,當管道寫滿後,寫函式會阻塞(等待讀取)

無名管道的建立

int pipe(int pipefd)

arg1 無名管道的兩個埠(讀和寫)

即1為寫端,0為讀端。需要程序間配合使用。

int main()

; int fd=pipe(pipefd);

if(fd != 0)

else

int len=0;

char buf[10]=;

while(1)

*///自己讀走

read(pipefd[0],buf,10);

printf("get:%s\n",buf);

}}

有名管道的建立

1 使用命令的方式建立

mkfifo 檔名

(共享目錄不支援管道檔案)

2 函式建立

int mkfifo(const char *pathname,mod_t mode);

arg1 需要建立的管道路徑

arg2 許可權

int fd=mkfifo("/home/gec/pipe",0777);

if(fd != 0)

有名管道的操作

1 open 開啟管道檔案

2 write/read 讀寫管道

3 close 關閉管道

注意事項:1 管道檔案的資料時先進先出的

2 管道檔案的讀寫都會阻塞

3 管道檔案不可以用lseek偏移游標

int fd = open("/home/gec/pipenode",o_rdwr);

if(fd < 0)

//不斷往管道中寫入資料

int len=0;

while(1)

訊號

訊號的命令

man 7 signal檢視

抓捕linux系統中的訊號

#include

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

引數一:需要捕抓訊號值

引數二:對應的處理函式

sig_ign ->忽略該訊號

sig_dfl ->執行預設動作

使用者自定義動作void (*sighandler_t)(int) -> 函式指標,指向返回型別為 void 引數為int的函式 (處理函式)

訊號傳送

void func(int arg)

int main()

sleep(1);

} return 0;

}

給自己傳送訊號

int raise(int sig); 等價於kill(getpid(), sig);

傳送鬧鈴訊號

//訊號處理函式

void func(int arg)

int main()

return 0;

}

關於程序間通訊

程序間通訊 ipc 的方式很多。下面進行歸類總結。在傳統的程序間通訊中有 無名管道,有名管道,訊號通訊。後來system v 退出了自己的ipc 方式 訊息佇列,共享記憶體和訊號燈集合但是system v的通訊方式也存在自己的缺點。posix 在此基礎上退出了自己的posix的訊息佇列,共享記憶體和...

程序間通訊和執行緒間通訊總結

死鎖的四個必要條件 資源有限 持有等待 不能搶占 迴圈等待條件 死鎖的應對方式 消除獨佔條件 即將資源無限增加或者變為共享 消除保持和請求條件 即乙個程序一次請求其所需要的所有資源,而不是請求一點資源做一點事情,但是這樣太過浪費。消除非搶占條件 即允許對資源進行搶占 消除迴圈等待條件 即產生迴圈等待...

程序間通訊方法總結

程序間通訊方法總結 程序通常被定義為乙個正在執行的程式的例項,它由兩個部分組成 乙個是作業系統用來管理程序的核心物件。核心物件也是系統用來存放關於程序的統計資訊的地方 另乙個是位址空間,它包含所有的可執行模組或dll模組的 和資料。它還包含動態分配的空間。如執行緒堆疊和堆分配空間。每個程序被賦予它自...