Linux C命名管道實現程序間通訊

2021-08-11 07:48:59 字數 1872 閱讀 2645

命名管道

命名管道也被稱為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的 檔案形式儲存於 檔案系統中。命名...

程序間通訊 命名管道

命名管道,和匿名管道,有了自己的名字,有了名字就可以操作。所以他不在侷限於有血緣關係的兩個程序之間,適用於任意的兩個程序。實際上和匿名管道一樣是一塊核心中的快取,和匿名管道不一樣的是,他在檔案系統中多了檔案,而匿名管道的檔案只存在與記憶體中,但是命名管道的檔案雖然存在,有在核心資料結構中有自己的環境...