Posted on 2009-07-18 13:52
天邊藍(lán) 閱讀(1293)
評論(0) 編輯 收藏 引用 所屬分類:
Linux
FIFO簡介
為了解決匿名管道的限制,Linux特地提出了FIFO管道,即有名管道。FIFO十通過文件來傳輸數(shù)據(jù)的,但其具有匿名管道的特性——在讀出數(shù)據(jù)時,F(xiàn)IFO同事清理管道為空。
創(chuàng)建FIFO管道
$mkfifo –m 600 fifocat
#include <sys/stat.h>
#include <sys/types.h>
int mkfifo( const char *filename, mode_t mode );
參數(shù)說明:mode指定FIFO的讀寫權(quán)限,新創(chuàng)建FIFO的用戶ID和組ID規(guī)則。與open函數(shù)相同。
參數(shù)mode 則有下列數(shù)種組合,只有在建立新文件時才會生效,此外真正建文件時的權(quán)限會受到umask值所影響,因此該文件權(quán)限應(yīng)該為(mode-umaks)。
S_IRWXU00700 權(quán)限,代表該文件所有者具有可讀、可寫及可執(zhí)行的權(quán)限。
S_IRUSR 或S_IREAD,00400權(quán)限,代表該文件所有者具有可讀取的權(quán)限。
S_IWUSR 或S_IWRITE,00200 權(quán)限,代表該文件所有者具有可寫入的權(quán)限。
S_IXUSR 或S_IEXEC,00100 權(quán)限,代表該文件所有者具有可執(zhí)行的權(quán)限。
S_IRWXG 00070權(quán)限,代表該文件用戶組具有可讀、可寫及可執(zhí)行的權(quán)限。
S_IRGRP 00040 權(quán)限,代表該文件用戶組具有可讀的權(quán)限。
S_IWGRP 00020權(quán)限,代表該文件用戶組具有可寫入的權(quán)限。
S_IXGRP 00010 權(quán)限,代表該文件用戶組具有可執(zhí)行的權(quán)限。
S_IRWXO 00007權(quán)限,代表其他用戶具有可讀、可寫及可執(zhí)行的權(quán)限。
S_IROTH 00004 權(quán)限,代表其他用戶具有可讀的權(quán)限
S_IWOTH 00002權(quán)限,代表其他用戶具有可寫入的權(quán)限。
S_IXOTH 00001 權(quán)限,代表其他用戶具有可執(zhí)行的權(quán)限。
%注意:當(dāng)要創(chuàng)建一個已經(jīng)存在的FIFO時,程序會產(chǎn)生一個EEXIST的異常
FIFO讀寫操作
般的I/O(open close read write unlink)函數(shù)都可以用于FIFO文件,需要注意的是,在使用open函數(shù)打開一個FIFO文件時,open函數(shù)參數(shù)flag標(biāo)志位的O_NONBLOCK標(biāo)志,它關(guān)系到函數(shù)的返回狀態(tài)。詳細(xì)說明如表14-2所示。
表14-2 open函數(shù)的flag(O_NONBLOCK)詳細(xì)說明
O_NONBLOCK標(biāo)志
詳 細(xì) 說 明
置位
只讀open立即返回。當(dāng)只寫open時,如果沒有進(jìn)程為讀打開FIFO,則返回–1,并置errno值為ENXIO
不置位
open視情況阻塞。只讀open要阻塞到有進(jìn)程為寫打開FIFO,只寫open要阻塞到有進(jìn)程為讀打開FIFO
FIFO的寫操作規(guī)則類似于匿名管道的寫操作規(guī)則,當(dāng)沒有進(jìn)程為讀打開FIFO,調(diào)用write函數(shù)來進(jìn)行寫操作會產(chǎn)生信號SIGPIPE,則信號可以被捕捉或者完全忽略。
%注意:當(dāng)FIFO的所有寫進(jìn)程都已經(jīng)關(guān)閉,則為FIFO的讀進(jìn)程產(chǎn)生一個文件結(jié)束符。
FIFO的缺點
當(dāng)然FIFO也有它的局限性,如圖14-6所示。客戶端可以發(fā)請求到服務(wù)器,但前提是要知道一個公共的FIFO通道,對于實現(xiàn)服務(wù)器回傳應(yīng)答到客戶端的問題,可以通過為每一個客戶端創(chuàng)建一個專用的FIFO,來實現(xiàn)回傳應(yīng)答。但也有不足,服務(wù)器會同時應(yīng)答成千上萬個客戶端,創(chuàng)建如此多的FIFO是否會使系統(tǒng)負(fù)載過大,相應(yīng)的如何判斷客戶端是否因意外而崩潰成為難題,或者客戶端不讀取應(yīng)答直接退出,所以服務(wù)器必須處理SIGPIPE信號,并做相應(yīng)處理。