日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux c fifo阻塞写和非阻塞写,linux—FIFO的使用与非阻塞标志(O_NONBLOCK)的影响

發布時間:2025/3/15 linux 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的影响的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。