IPC機制和實現

2021-09-01 17:37:32 字數 3460 閱讀 8175

(1)管道(pipe):管道可用於具有親緣關係程序間的通訊,允許乙個程序和另乙個與它有共同祖先的程序之間進行通訊。

(2)命名管道(named pipe):命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊。命名管道在檔案系統中有對應的檔名。命名管道通過命令mkfifo或系統呼叫mkfifo來建立。

(3)訊號(signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身;linux除了支援unix早期訊號語義函式sigal外,還支援語義符合posix.1標準的訊號函式sigaction(實際上,該函式是基於bsd的,bsd為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式)。

(4)訊息(message)佇列:訊息佇列是訊息的鏈結表,包括posix訊息佇列system v訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺

建立: msgget();寫入訊息:msgsnd();讀取訊息:msgrcv();刪除:msgctl();

(5)共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用ipc形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。

建立:shmget();附加:shmat();分離:shmdt();

記憶體對映允許任何多個程序間通訊,每乙個使用該機制的程序通過把乙個共享的檔案對映到自己的程序位址空間來實現它。

(7)訊號量(semaphore):主要作為程序間以及同一程序不同執行緒之間的同步手段。

建立:semget();控制刪除:semctl();

(8)套介面(socket):更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由unix系統的bsd分支開發出來的,但現在一般可以移植到其它類unix系統上:linux和system v的變種都支援套接字。

一、管道

(1)管道

管道是單向的、先進先出的、無結構的、固定大小的位元組流,它把乙個程序的標準輸出和另乙個程序的標準輸入連線在一起。寫程序在管道的尾端寫入資料,讀程序在管道的首端讀出資料。資料讀出後將從管道中移走,其它讀程序都不能再讀到這些資料。管道提供了簡單的流控制機制。程序試圖讀空管道時,在有資料寫入管道前,程序將一直阻塞。同樣,管道已經滿時,程序再試圖寫管道,在其它程序從管道中移走資料之前,寫程序將一直阻塞。讀寫管道的例程:

#include

#include

#include

#include

#include

int main()

if((pid=fork())==0)   //在子程序中讀管道(關閉寫管道)

close(pipe_fd[0]);

exit(0);

}else if(pid>0)    //在父程序中寫管道(關閉讀管道)

}(2)標準流管道

#include

#include

#include

#include

#define bufsize 1000

int main()

(3)命名管道

也叫fifo,與管道不同,fifo不是臨時的物件,它們是檔案系統中真正的實體,可以用mkfifo命令建立。只要有合適的訪問許可權,程序就可以使用fifo。fifo的開啟方式和管道稍微不同。乙個管道(它的兩個file資料結構、vfs i節點和共享資料頁)是一次性建立的,而fifo已經存在,可以由它的使用者開啟和關閉。linux必須處理在寫程序開啟fifo之前讀程序對它的開啟,也必須處理在寫程序寫資料之前讀程序對管道的讀。除此以外,fifo幾乎和管道的處理完全一樣,而且它們使用一樣的資料結構和操作。

讀程序:

#include

#include

#include

#include

#include

#include

#include

#define fifo "/tmp/myfifo"

main(int argc,char** argv)

while(1)

printf("read %s from fifo\n",buf_r);

sleep(1);

} pause();

unlink(fifo);}

寫程序:

#include

#include

#include

#include

#include

#include

#include

#define fifo_server "/tmp/myfifo"

main(int argc,char** argv)

else

printf("write %s to the fifo\n",w_buf);}

二、訊號

(1)訊號的發出:kill(),raise()給自身程序傳送訊號。

#include

#include

#include

#include

#include

int main()

if(pid == 0)

else}}

} (2)alarm(),pause()

#include

#include

#include

int main()

(3)signal(),傳送訊號

ctrl+c:sigint,ctrl+/:sigquit

#include

#include

#include

void my_func(int sign_no)

int main()

(4)訊號集,接受多個訊號,同時多個訊號處理函式

#include

#include

#include

#include

#include

void my_func(int signum)

int main()

if(sigprocmask(sig_unblock,&set,null)<0)

perror("sigprocmask");

else

printf("unblock\n");

while(1)else if(sigismember(&set,sigquit))}}

IPC實現機制(二) 命名管道(FIFO)

一 fifo的概念 匿名管道 pipe 的 個不 之處是沒有名字,因此,只能 於具有親緣關係的程序間通訊 因此,提出了命名管道 命名管道 fifo 提供 個路徑名與之關聯,以fifo的 件形式儲存於 件系統中。命名管道是 個裝置 件,因此,即使程序與建立fifo的程序不存在親緣關係,只要可以訪問該路...

linux核心IPC機制

未完,待續.摘要 本文將從乙個例項出發,逐步剖析linux核心是如何實現訊號量機制的.正文 訊號量使用例項 1 訊號量建立例項 void sem create test void int key fd,key value int sem id union semun sem args unsigne...

RTT的IPC機制篇 IPC通訊總結

總結1 rtt通訊方式總結 2018年12月29日 10 47 ipc inter process communication 1,rtt的通訊機制 訊息佇列 郵箱 訊號量 互斥量 事件。2.我又按照其傳輸的內容分為 資料類和非資料類通訊。非資料類,執行緒間 執行緒與中斷傳輸非資料類資訊,實現執行緒...