命名管道
1. 差別
普通管道隻能用于一個程序家族之間的通信,如父子,兄弟之間,而命名管道是有”名字”的管道,另外的程序可以看到并使用。普通管道在記憶體中,随着程序的結束而消失,命名管道在磁盤上,作為一個特殊的裝置檔案而存在,程序結束不消失。
2.使用
首先使用mkfifo()函數建立一個命名管道,再使用open()打開,打開成功後可進行讀/寫操作。
3.頭檔案
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
4. 函數原型
int mkfifo(const char *pathname,mode_t mode mode);
參數:pathname 路徑名 如”/tmp/myfifo”
mode該管道的權限 如O_CREAT,O_EXCL,O_NONBLOCK
傳回: 成功 0 出錯傳回-1 錯誤存儲在errno中
錯誤代碼
EACCESS 參數pathname所指定的目錄路徑無可執行的權限
EEXIST 參數pathname所指定的檔案已存在。
ENAMETOOLONG 參數pathname的路徑名稱太長。
ENOENT 參數pathname包含的目錄不存在
ENOSPC 檔案系統的剩餘空間不足
ENOTDIR 參數pathname路徑中的目錄存在但卻非真正的目錄。
EROFS 參數pathname指定的檔案存在于隻讀檔案系統内。
int open( const char * pathname,int flags, mode_t mode);
參數:
pathname指向欲打開的檔案路徑字元串
下列是參數flags 所能使用的旗标:
O_RDONLY 以隻讀方式打開檔案
O_WRONLY 以隻寫方式打開檔案
O_RDWR 以可讀寫方式打開檔案。
上述三種旗标是互斥的,也就是不可同時使用,但可與下列的旗标利用OR(|)運算符組合。
O_CREAT 若欲打開的檔案不存在則自動建立該檔案。
O_EXCL 如果O_CREAT 也被設定,此指令會去檢查檔案是否存在。檔案若不存在則建立該檔案,否則将導緻打開檔案錯誤。此外,若O_CREAT與O_EXCL同時設定,并且欲打開的檔案為符号連接配接,則會打開檔案失敗。
O_NOCTTY 如果欲打開的檔案為終端機裝置時,則不會将該終端機當成程序控制終端機。
O_TRUNC 若檔案存在并且以可寫的方式打開時,此旗标會令檔案長度清為0,而原來存于該檔案的 資料也會消失。
O_APPEND 當讀寫檔案時會從檔案尾開始移動,也就是所寫入的資料會以附加的方式加入到檔案後面。
O_NONBLOCK 以不可阻斷的方式打開檔案,也就是無論有無資料讀取或等待,都會立即傳回程序之中。
O_NDELAY 同O_NONBLOCK。
O_SYNC 以同步的方式打開檔案。
O_NOFOLLOW 如果參數pathname 所指的檔案為一符号連接配接,則會令打開檔案失敗。
O_DIRECTORY 如果參數pathname 所指的檔案并非為一目錄,則會令打開檔案失敗。
參數mode 則有下列數種組合,隻有在建立新檔案時才會生效.
傳回:若所有欲核查的權限都通過了檢查則傳回0 值,表示成功,隻要有一個權限被禁止則傳回-1
EEXIST 參數pathname 所指的檔案已存在,卻使用了O_CREAT和O_EXCL旗标。 EACCESS 參數pathname所指的檔案不符合所要求測試的權限。
EROFS 欲測試寫入權限的檔案存在于隻讀檔案系統内。
EFAULT 參數pathname指針超出可存取記憶體空間。
EINVAL 參數mode 不正确。
ENAMETOOLONG 參數pathname太長。
ENOTDIR 參數pathname不是目錄。
ENOMEM 核心記憶體不足。
ELOOP 參數pathname有過多符号連接配接問題。
EIO I/O 存取錯誤。
注意
當使用open()來打開 FIFO檔案時,O_NONBLOCK旗标會有影響
1、當使用O_NONBLOCK 時,對命名管道的讀取會立刻傳回。但是若還沒有其他程序打開FIFO 檔案來讀取,則寫入的操作會傳回ENXIO 錯誤代碼。
2、沒有使用O_NONBLOCK 時,對命名管道的讀取會等到其他程序打開FIFO檔案來寫入才正常傳回。同樣地,打開FIFO檔案來寫入的操作會等到其他程序打開FIFO 檔案來讀取後才正常傳回。
3.使用O_NONBLOCK,必須先有程序以讀的方式打開這個管道
例如:int fp=open(FIFO,O_RDWR|O_NONBLOCK,0);打開夠進行讀取read(fp,buf,20);将會立即傳回讀取的資料。沒有O_NONBLOCK屬性,讀取将會處于阻塞狀态,知道有資料寫入此命名管道
3對命名管道的讀寫,和檔案操作一緻。
5代碼
讀取代碼
寫入代碼