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。
參考來源:
- man fifo
- man 7 pipe
- http://www.gnu.org/software/libc/manual/html_node/Pipe-Atomicity.html
- socketpair() 是雙向的
- http://www.linuxjournal.com/article/2156 (透過指令使用 named pipe)
- http://beej.us/guide/bgipc/output/html/multipage/fifos.html
- http://www.tldp.org/LDP/lpg/node15.html
沒有留言:
張貼留言