linux c fifo阻塞写和非阻塞写,linux—FIFO的使用与非阻塞标志(O_NONBLOCK)的影响
FIFO文
#include
#include
int mkfifo( const char*pathname, mode_t mode);
參數:
pathname:FIFO的路徑名+文件名。
mode:mode_t類型的權限描述符,同open的參數。
返回值:
成功:返回0
失敗:如果文件已經存在,則會出錯且返回-1。
操作FIFO文件時的特點:
系統調用的I/O函數都可以作用于FIFO,如open、close、read、write等。
打開FIFO時,非阻塞標志(O_NONBLOCK)產生下列影響:
特點一:不指定O_NONBLOCK(即open沒有位或O_NONBLOCK)
1、open以只讀方式打開FIFO時,要阻塞到某個進程為寫而打開此FIFO
2、open以只寫方式打開FIFO時,要阻塞到某個進程為讀而打開此FIFO。
3、open以只讀、只寫方式打開FIFO時會阻塞,調用read函數從FIFO里讀數據時read也會阻塞。
4、調用write函數向FIFO里寫數據,當緩沖區已滿時write也會阻塞。
5、通信過程中若寫進程先退出了,則調用read函數從FIFO里讀數據時不阻塞;若寫進程又重新運行,則調用read函數從FIFO里讀數據時又恢復阻塞。
6、通信過程中,讀進程退出后,寫進程向命名管道內寫數據時,寫進程也會(收到SIGPIPE信號)退出。
特點二:指定O_NONBLOCK(即open位或O_NONBLOCK)
1、先以只讀方式打開:如果沒有進程已經為寫而打開一個FIFO, 只讀open成功,并且open不阻塞。
2、先以只寫方式打開:如果沒有進程已經為讀而打開一個FIFO,只寫open將出錯返回-1。
3、read、write讀寫命名管道中讀數據時不阻塞。
4、通信過程中,讀進程退出后,寫進程向命名管道內寫數據時,寫進程也會(收到SIGPIPE信號)退出。
注意:
open函數以可讀可寫方式打開FIFO文件時的特點:open不阻塞,可以這樣理解:因為其本身以可讀可寫的方式打開,所以不需要別的進程幫其打開。
注:關于非阻塞方式或非阻塞打開FIFO,read時返回值的問題:
若某個FIFO的最后一個寫進程終止了或關閉了該FIFO,那么將為FIFO的讀進程產生一個文件結束標志。如果 read()讀數據時第一個讀到的是文件結束標志,那么就返回0。
1、阻塞方式:
1) 寫進程未退出,read阻塞,等待寫端的輸入
2) 寫進程終止了或關閉了該FIFO,read非阻塞,為FIFO的讀進程產生一個文件結束標志,read的返回值為0。
2、非阻塞方式:
假設一個進程以非阻塞讀方式打開一個FIFO.該FIFO之前已經被以寫方式被其他進程打開,但無數據被寫入,那么此時讀進程需要立刻返回,那么應該返回什么呢?
我們知道 如果 read()讀數據時第一個讀到的是文件結束標志,那么就返回0。如果像 我們想的那樣 沒有數據讀應該返回0 ,那么這個0就具有二義性。因為我們不知道是沒有數據造成的返回0還是寫端關閉造成的返回0.
所以POSIX.1要求,對一個非阻塞的描述符如果無數據可讀,則read返回-1,而且 errno被設置為 EAGAIN。
1) 如果在隨后調用read函數之前,如果另一個進程已經以寫方式打開了該FIFO,并寫入了數據,那么正常讀取數據。
2) 如果在隨后調用read函數之前,如果另一個進程已經以寫方式打開了該FIFO,但是并未寫入數據,read調用會立刻出錯返回-1, 并設置 errnno為EAGAIN。
3)如果在隨后調用read函數之前,沒有其他進程以寫方式打開該FIFO,或是曾經有但是在read讀時已經關閉了,那么read返回0,表示讀到文件結束標志。
總結
以上是生活随笔為你收集整理的linux c fifo阻塞写和非阻塞写,linux—FIFO的使用与非阻塞标志(O_NONBLOCK)的影响的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab自带的人脸分类器,基于MAT
- 下一篇: linux ora-00031,kill