程序間通訊 管道

2021-08-24 17:43:43 字數 3014 閱讀 1436

程序間通訊的目的:

相關名詞解釋:

什麼是管道?

匿名管道:

函式原型:

#includeint pipe(int fd[2]);
呼叫pipe函式時在核心中開闢一塊緩衝區(稱為管道),用於使用者之間通訊,它有乙個讀端,乙個寫端,然後通過filedes函式傳給使用者程式。

倆個檔案描述符,filedes[0]指向管道的讀端,filedes[1]指向管道的寫端,所以管道在使用者程式看起來像乙個開啟的檔案。通過read(filedes[0])或者write(fildes[1])向這個檔案讀寫資料,其實就是在讀寫核心緩衝區

管道建立過程:

父程序呼叫pipe開闢管道,得到倆個檔案描述符,指向管道的倆端

父程序呼叫fork函式建立子程序,那麼子程序也有倆個檔案描述符指向同乙個管道

父程序關閉管道讀端,子程序關閉管道寫端,父程序可以向裡面寫入資料,子程序可以從裡面讀取資料

管道的特徵:

只能實現單項通訊,父程序寫,子程序讀。若要實現雙向通訊,可以建立倆個管道

管道之間必須有血緣關係(命名管道可以實現任意倆個程序之間的通訊,不用管是否有血緣關係)

管道的生命週期隨程序,程序退出,管道釋放

管道自帶互斥與同步機制(不用擔心若倆個程序同時向管道裡寫入資料而產生的資料的不一致等問題)

管道提供面向位元組流的服務(不用將管道內的資料全部讀完,想讀多少位元組完全由上層應用決定)

從檔案描述符角度來理解管道:

1.父程序建立管道

2.子程序fork出子程序

3.父程序關閉fd[0],子程序關閉fd[1]

在核心角度了解管道本質:

看待管道應該向看待檔案一樣,在7向管道讀寫資料時,可以呼叫write,read函式,迎合了「linux下一切皆檔案的思想」

管道的讀寫規則:

匿名管道的實現:

1 #include2 #include3 #include4 

5 int main()

6 14

15 pid_t id = fork();

16 if(id==0)

17

25 }

26 else

27

38 }

39 }

40 return 0;

41 }

執行結果如下:

命名管道:

fifo不同於管道之處在於它提供乙個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中,命名管道是乙個裝置檔案,因此,即使程序和建立fifo的基礎之間不存在親緣關係,只有可以訪問路徑,就能夠通過fifo相互通訊,fifo按照先進先出的原則工作.

建立乙個命名管道:

函式原型:

#includeint mkfifo(const char *filename,mode_t mode);
引數:

返回值:成功返回0,失敗返回-1 

匿名管道和命名管道的區別:

命名管道開啟規則:

命名管道實現

1.讀取檔案txt內容,寫入管道myfifo

1 #include2 #include3 #include4 #include5 

6 int main()

7 16

17 int outfd = open("myfifo",o_wronly);

18 if(outfd==-1)

19

23 24 char buf[64];

25 size_t s;

26 while((s = read(infd,buf,sizeof(buf)))>0)

27

30 close(infd);

31 close(outfd);

32 return 0;

33 }

2.讀取管道,將資料寫到txt1檔案中

1 #include2 #include3 #include4 #include5 

6 int main()

7 17

18 int infd = open("myfifo",o_rdonly);

19 if(infd == -1)

20

24 25 char buf[64];

26 size_t s;

27 while((s = read(infd,buf,sizeof(buf)))>0)

28

31 close(infd);

32 close(outfd);

33 unlink("myfifo");

34 return 0;

35 }

程序間通訊 管道

include int pipe int fd 2 返回值 若成功,返回0,若出錯,返回 1經由引數fd返回兩個檔案描述符 fd 0 為讀而開啟,fd 1 為寫而開啟。fd 1 的輸出是fd 0 的輸入。else if pid 0 子程序 else else if pid 0 父程序 printf ...

程序間通訊 管道

原文 程序間通訊 管道 管道簡介 常說的管道都是匿名半雙工管道,匿名半雙工管道在系統中是沒有實名的,並不可以在檔案系統中以任何方式看到該管道。它只是程序的一種資源,會隨著程序的結束而被系統清除。管道通訊是在unix系統中應用比較頻繁的一種方式,例如使用grep查詢 ls grep ipc 顧名思義,...

程序間通訊 管道

程序間通訊,又稱為ipc,包含以下型別 半雙工管道fifo 全雙工管道 訊息佇列 訊號 訊號量共享記憶體 套接字socket streams。一,管道是unix系統ipc的最古老形式,他具有兩種侷限性 1 資料只能在乙個方向上流動 2 只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該...