2015年8月22日 星期六

Linux pipe and FIFO

pipe 是單向的程序間通訊通道,訊息由寫入端寫入,由讀取端讀出。pipe 透過系統呼叫 pipe() 建立,傳回兩個 fd 分別為讀取端跟寫入端。

FIFO 是有名子的 pipe (named pipe),名子就是一個 S_FIFO 的特殊檔案,由 mkfifo() 或 mknod() 所建立。任何 process 只要權限允許,都可以開啟這個檔案讀取 (O_WRONLY) 或寫入 (O_RDONLY) 來交換訊息。FIFO 跟 pipe 只是建立跟開啟的方式不同,後續運作是相同的。雖然 FIFO 是個檔案,但資料實際上並不會寫入背後的檔案系統。

一些特性:
  • open() 會等待,直到讀取端跟寫入端都有開啟了,除非以 O_NONBLOCK 來開啟。
  • read() 時會等待到有資料。如果此時已經沒有任何寫入端,就不會等待,會讀到長度 0。如果開啟為 O_NONBLOCK,就不會等待資料。如果開啟為 O_ASYNC,當有心資料時,讀取端會產生 SIGIO。
  • write() 的訊息如果 ≤ PIPE_BUF = 4096,會一次寫入,如果空間不夠會等候;但開啟為 O_NONBLOCK 的話,就直接回錯誤碼 EAGAIN。Linux 2.6.11 開始,容量有 65536 bytes。如果寫入時沒有任何讀取端,會導致 SIGPIPE 或 EPIPE。

參考來源:
  1. man fifo
  2. man 7 pipe
  3. http://www.gnu.org/software/libc/manual/html_node/Pipe-Atomicity.html
延伸閱讀

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...