進程間的通訊-----管道

進程間的通訊:兩個以上的進程相互傳遞數據

管道就是進程通訊方式的一種。管道分爲有名管道和無名管道

管道:在進程之間建立數據傳輸的橋樑, 已完成數據的流通。
注意: 管道是一種半雙工通訊
<一>有名管道

概念:有名管道在磁盤上會佔據一個 inode 節點, 但是不開闢 block。 有名管道會有一個文件名。
有名管道的操作:

創建有名管道文件:
               1、 mkfifo 命令創建管道文件
               2、 在程序中調用 mkfifo()函數創建管道文件。
通過對文件的操作(open,write ,read,close)來操作管道文件進而達到進程間數據的流通

有名管道的原理:在磁盤上創建一個inode節點,但是不開闢block,有名管道會有一個文件名,兩個進程之間通過打開同一個管道文件實現進程通訊,有名管道是一種特殊的文件,存在於文件系統中

管道

有名管道的代碼操作如圖:A 進程負責接受用戶輸入的數據, B 進程將用戶輸入的數據存儲到普通文件 a.txt 中
1:有名管道寫端(A進程)

管道代碼

2:有名管道讀端(B進程)

管道代碼2

<二>無名管道  

 概念:無名管道並不會創建管道文件, 所以, 無名管道只能應用於父子進程之間。 因爲父子進程之間對於 fork 之前打開的文件描述符是共享的。
無名管道的操作:int pipe(int fd[2]); 用於創建並打開一個無名管道, 並且使 fd[0]指向管道的讀端, fd[1]指向管道的寫端
讀無名管道中的數據: read(fds[0], ...);
給無名管道中寫數據: write(fds[1], ...);
關閉無名管道: close(fds[0]); close(fds[1]);(由於管道是半雙工通訊,所以父子進程只能打開讀端或寫端,因此必須關閉掉不用打開的一端)
無名管道的原理如圖                            

管道

無名管道的代碼操作:父進程接受用戶數據的數據, 子進程則將用戶數據的字符串逆序打印。

無名管道

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章