命名管道
命名管道也被稱為fifo檔案,它是一種特殊型別的檔案,它在檔案系統中以檔名的形式存在,但是它的行為卻和之前所講的沒有名字的管道(匿名管道)類似。
建立命名管道
以下兩個函式都可以用來建立命名管道(任選乙個),函式原型如下:
#include #include int mkfifo(const char *filename, mode_t mode);
int mknod(const char *filename, mode_t mode | s_ififo, (dev_t)0);
mkfifo函式,filename表示檔名,mode則表示檔案的讀寫許可權。
mknod函式,引數中path為建立的命名管道的全路徑名:mod為建立的命名管道的模式,指明其訪問許可權;dev為裝置值,該值取決於⽂件建立的種類,它只在建立裝置⽂件時才會⽤到。這兩個函式調⽤成功都返回0,失敗都返回-1。
另外,mknod屬於較老的函式,而mkfifo函式使用起來更見簡單規範,建議使用mkfifo函式。
這兩個函式都能建立乙個fifo檔案,但其實是建立了乙個確實存在與檔案系統中的檔案,命名管道在建立後就可以使用了,命名管道和管道的使用方法基本相同,但是使用命名管道是,必須呼叫open函式將其開啟。
open阻塞
呼叫open()開啟命名管道的程序是可能會被阻塞,如果以唯讀(o_rdonly)開啟,呼叫open()函式的程序將會被阻塞直到有寫方式開啟管道;同樣的以寫的方式(o_wronly)開啟也會阻塞直到有讀方式開啟管道;另外如果不希望在進行命名管道操作時發生阻塞,可以在oprn()呼叫中使用o_nonblock標誌,以關閉預設的阻塞動作。
下面來看乙個簡單的例子:
write端
#include#include#include#include#include#include#define path "./myfifo"
#define size 200
int main()
int fd=open(path,o_wronly);
if(fd < 0)
char buffer[size];
memset(buffer,'\0',sizeof(buffer));
while(1)
if(strncmp(buffer,"end",3)==0)
}close(fd);
return 0;
}
read端
#include#include#include#include#include#include#define path "./myfifo"
#define size 200
int main()
char buffer[size];
memset(buffer,'\0',sizeof(buffer));
while(1)
printf("%s\n",buffer);
if(strncmp(buffer,"end",3)==0)
}close(fd);
return 0;
}
先執行write端,再執行read端,在write端輸入資料,就可以在read端讀出資料,直到輸入end結束通訊。
命名管道實現程序間通訊
include include include include include include include define fifo server tmp myfifo main int argc,char argv argc 引數個數?argv 引數 else printf write s to...
程序間通訊 命名管道
程序間通訊的本質是不同的程序看到了同乙份公共的資源。而管道的 乙個不 足之處是沒有名字,因此,只能 用於具有親緣關係的程序間通訊,在命名管道 named pipe或fifo 提出後,該限制得到了克服。fifo不同於管道之處在於它提供 乙個路徑名與之關聯,以fifo的 檔案形式儲存於 檔案系統中。命名...
程序間通訊 命名管道
命名管道,和匿名管道,有了自己的名字,有了名字就可以操作。所以他不在侷限於有血緣關係的兩個程序之間,適用於任意的兩個程序。實際上和匿名管道一樣是一塊核心中的快取,和匿名管道不一樣的是,他在檔案系統中多了檔案,而匿名管道的檔案只存在與記憶體中,但是命名管道的檔案雖然存在,有在核心資料結構中有自己的環境...