一. 管道:
2.半雙工通信模式
3.一種特殊的檔案,是一種隻存在于核心中的讀寫函數
管道基于檔案描述符,管道建立時,有兩個檔案描述符:
a. fd[0]: 固定用于讀管道
b. fd[1]: 固定用于寫管道
建立管道:pipe()

一般步驟:1. pipe()建立管道 2. fork()建立子程序 3. 子程序會繼承父程序的管道
關閉管道:1. 逐個關閉檔案描述符 2. close()
eg. 父子程序間的管道通信:父子程序對管道分别有自己的讀寫通道,把無關的讀端或寫段關閉。
View Code
二. 有名管道FIFO
1. 使不相關的兩個程序彼此通信:a. 通過路徑名指出,在檔案系統中可見
b. 管道建立後,兩程序可按普通檔案一樣對其操作
2. FIFO遵循先進先出規則:a. 對管道讀從開始處傳回資料
b. 對管道寫則把資料添加到末尾
c. 不支援如lseek()等檔案定位操作
建立有名管道:mkfifo()
建立管道成功後,可使用open()、read()和write()等函數。
為讀而打開的管道可在open()中設定O_RDONLY
為寫而打開的管道可在open()中設定O_WRONLY
與普通檔案不同的是阻塞問題
•普通檔案的讀寫時不會出現阻塞問題
•在管道的讀寫中卻有阻塞的可能,
•非阻塞标志:在open()函數中設定為O_NONBLOCK
阻塞打開與非阻塞打開
對于讀程序
•若該管道是阻塞打開,且目前FIFO内沒有資料,則對讀程序而言将一直阻塞到有資料寫入
•若該管道是非阻塞打開,則不論FIFO内是否有資料,讀程序都會立即執行讀操作。即如果FIFO内沒有資料,則讀函數将立刻傳回0
對于寫程序
•若該管道是阻塞打開,則寫操作将一直阻塞到資料可以被寫入
•若該管道是非阻塞打開而不能寫入全部資料,則讀操作進行部分寫入或者調用失敗