天天看點

Linux--程序間通信(管道及有名管道FIFO)(轉)

一. 管道:

   2.半雙工通信模式

   3.一種特殊的檔案,是一種隻存在于核心中的讀寫函數

管道基于檔案描述符,管道建立時,有兩個檔案描述符:

a. fd[0]: 固定用于讀管道

b. fd[1]: 固定用于寫管道

建立管道:pipe()

Linux--程式間通信(管道及有名管道FIFO)(轉)

     一般步驟:1. pipe()建立管道  2. fork()建立子程序  3. 子程序會繼承父程序的管道

關閉管道:1. 逐個關閉檔案描述符  2. close()

eg. 父子程序間的管道通信:父子程序對管道分别有自己的讀寫通道,把無關的讀端或寫段關閉。

  

View Code

Linux--程式間通信(管道及有名管道FIFO)(轉)

二. 有名管道FIFO

  1. 使不相關的兩個程序彼此通信:a. 通過路徑名指出,在檔案系統中可見  

                  b. 管道建立後,兩程序可按普通檔案一樣對其操作

  2. FIFO遵循先進先出規則:a. 對管道讀從開始處傳回資料

                b. 對管道寫則把資料添加到末尾

                c. 不支援如lseek()等檔案定位操作

  建立有名管道:mkfifo()

Linux--程式間通信(管道及有名管道FIFO)(轉)

建立管道成功後,可使用open()、read()和write()等函數。

  為讀而打開的管道可在open()中設定O_RDONLY

  為寫而打開的管道可在open()中設定O_WRONLY

與普通檔案不同的是阻塞問題

  •普通檔案的讀寫時不會出現阻塞問題

  •在管道的讀寫中卻有阻塞的可能,

  •非阻塞标志:在open()函數中設定為O_NONBLOCK

阻塞打開與非阻塞打開

對于讀程序

  •若該管道是阻塞打開,且目前FIFO内沒有資料,則對讀程序而言将一直阻塞到有資料寫入

  •若該管道是非阻塞打開,則不論FIFO内是否有資料,讀程序都會立即執行讀操作。即如果FIFO内沒有資料,則讀函數将立刻傳回0

對于寫程序

  •若該管道是阻塞打開,則寫操作将一直阻塞到資料可以被寫入

  •若該管道是非阻塞打開而不能寫入全部資料,則讀操作進行部分寫入或者調用失敗