apue FIFO 不是檔案的檔案

2022-01-22 15:34:06 字數 1445 閱讀 6598

眾所周知,fifo中文譯為命名管道,是pipe的公升級版。而pipe是管道,系統提供的一種程序間通訊方式,fifo與pipe有以下方面不同:

1) fifo需要先在檔案系統建立(mkfifo),之後使用檔案介面操作(open/close/read/write);而pipe不與檔案系統相關聯,建立pipe後直接讀寫(pipe),無需開啟;

2) pipe只能在父子關係的程序間使用,本質是通過fork複製了母程序空間從而擴充套件到另乙個程序;而fifo關聯的各個程序間更為自由,不必由fork產生也可以使用。

但他們都是管道,本質上就是核心開闢的一塊快取區,雖然fifo在檔案系統有乙個入口,但是它和檔案有很大不同,具體體現在使用fifo的檔案介面的幾個限制上:

1) 如果讀程序以唯讀方式開啟fifo,若此時還沒有寫程序開啟fifo,則讀程序會阻塞在open上,直到有程序以寫方式開啟fifo檔案;

2) 如果寫程序以只寫方式開啟fifo,若此時還沒有讀程序開啟fifo,則寫程序會阻塞在open上,直到有程序以讀方式開啟fifo檔案;

3) 如果程序以讀寫方式開啟fifo,此時open將不再阻塞,但是如果此時沒有寫程序向管道內寫資料,則讀取將阻塞在read上,直到有程序寫入資料為止。(需要注意的是如果之前有程序寫入過資料,但是該程序在本程序open之前已經關閉fifo,則相應的資料是讀不到的);

4) 如果程序以讀寫方式開啟fifo,此時open將不再阻塞,不管有沒有讀程序從管道讀資料,寫資料(write)都將成功返回,直到底層緩衝區被寫滿;

5) 如果程序以唯讀且非同步方式(o_nonblock)開啟fifo,則不論有沒有寫程序開啟fifo,都不會阻塞在open上。但如果此時沒有寫程序寫入資料,後續read將返回0;

6) 如果程序以只寫且非同步方式(o_nonblock)開啟fifo,若此時還沒有讀程序開啟fifo,則open返回-1,errno設定為enxio(6 /* no such device or address */)

一般很少用讀寫方式開啟fifo,因為那樣很容易讀到自己寫入的資料,除非此fifo就是用來在程序內部多個執行緒之間使用的。

可以看到上面林林總總的各種限制,指向的乙個目標就是:保證讀寫程序同時開啟fifo並進行資料交換。換句話說,就是fifo沒有任何臨時儲存資料的能力,錯過了,就沒了。

從這個意義上說,fifo根本不是檔案。

除此之外,fifo在讀寫程序退出時的表現,也與pipe相似,而與檔案不同:

1) 當所有讀程序退出後,寫程序再寫入資料會收到sigpipe訊號;

2) 當所有寫程序退出後,讀程序再讀取資料read會返回0;

對於第1點,特別宣告一下,就是在pipe中,多對一的情況與一對一讀寫程序不同,當讀程序退出時,多個寫程序並沒有收到sigpipe訊號,詳見下面這篇文章:

多程序管道讀寫的一些疑問

總之,從各方來說,fifo都是乙個pipe,而不是乙個傳統意義上的檔案

測試讀**

測試寫**

Makefile中目標檔案不是真正的檔案時

有一條命令如下 nroff man flip.1 flip.man 該命令會編譯檔案flip.1,並將輸出儲存在flip.man 寫乙個makefile,用make man來執行它,如果這樣寫 all man man flip.1 nroff man flip.1 flip.man 這裡因為man並...

判斷是不是PE檔案

include include assert.h include include tchar.h ifdef unicode define ispefile ispefilew define isdigisig isdigisigw else define ispefile ispefilea de...

c語言的標頭檔案 不是c 類的標頭檔案

下面的概述是參考的這篇文章 c語言程式設計中也有,也需要標頭檔案,標頭檔案不只是c 的類才需要 比如 c中的string.h,記憶體操作的標頭檔案 include 即是 c語言中,函式 變數的宣告和實現,也可以像c 一樣,標頭檔案中,哪些函式 變數需要使用extern來說明?c語言有乙個約定 凡是在...