進程間的通訊:兩個以上的進程相互傳遞數據
管道就是進程通訊方式的一種。管道分爲有名管道和無名管道
管道:在進程之間建立數據傳輸的橋樑, 已完成數據的流通。
注意: 管道是一種半雙工通訊
<一>有名管道
概念:有名管道在磁盤上會佔據一個 inode 節點, 但是不開闢 block。 有名管道會有一個文件名。
有名管道的操作:
創建有名管道文件:
1、 mkfifo 命令創建管道文件
2、 在程序中調用 mkfifo()函數創建管道文件。
通過對文件的操作(open,write ,read,close)來操作管道文件進而達到進程間數據的流通
有名管道的原理:在磁盤上創建一個inode節點,但是不開闢block,有名管道會有一個文件名,兩個進程之間通過打開同一個管道文件實現進程通訊,有名管道是一種特殊的文件,存在於文件系統中
有名管道的代碼操作如圖:A 進程負責接受用戶輸入的數據, B 進程將用戶輸入的數據存儲到普通文件 a.txt 中
1:有名管道寫端(A進程)
2:有名管道讀端(B進程)
<二>無名管道
概念:無名管道並不會創建管道文件, 所以, 無名管道只能應用於父子進程之間。 因爲父子進程之間對於 fork 之前打開的文件描述符是共享的。
無名管道的操作:int pipe(int fd[2]); 用於創建並打開一個無名管道, 並且使 fd[0]指向管道的讀端, fd[1]指向管道的寫端
讀無名管道中的數據: read(fds[0], ...);
給無名管道中寫數據: write(fds[1], ...);
關閉無名管道: close(fds[0]); close(fds[1]);(由於管道是半雙工通訊,所以父子進程只能打開讀端或寫端,因此必須關閉掉不用打開的一端)
無名管道的原理如圖
無名管道的代碼操作:父進程接受用戶數據的數據, 子進程則將用戶數據的字符串逆序打印。