天天看點

Linux程序通信 命名管道

命名管道

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代碼

讀取代碼

 寫入代碼

繼續閱讀