Linux命名管道

2021-06-23 09:49:41 字數 1218 閱讀 7785

命名管道實現了沒有親緣關係的程序的通訊,建立命名管道時候,系統建立了乙個fifo的檔案,通過對檔案的操作,實現走了沒有親緣關係的管道也可以資料交換,相比普通管道

命名管道多了管道的開啟和刪除,因為是檔案嗎,當然劇本檔案的屬性了。

1.可以通過該shell命令建立命名管道,mknod 和mkfifo,比如通過命令建立命名管道p1;

mkfifo -m 0644 p1或者mknod p1 p;
2.系統提供了

int mkfifo (__const char *__path, __mode_t __mode);
管道的讀寫和檔案無異,可以用open開啟,兩種方式開啟阻塞(預設),非阻塞(open的標誌設定為 o_nonblock). 

在非阻塞模式下,對管道的唯讀開啟立即返回,而如果實現沒有程序以唯讀方式開啟管道,則對管道的寫方式開啟返回失敗,enxio.

阻塞模式:當開啟乙個管道讀時,如果沒有開啟管道用於寫的程序,則該開啟操作將被阻塞,直道有乙個程序用寫的方式開啟該管道為止。反之亦然。

案例1.先以唯讀方式開啟管道檔案

#include#include#include#include#include#include#include #include#include#include#include/****以唯讀方式開啟建立的管道p1,檢測阻塞方式開啟管道的過程*/

// 會因為沒有乙個以寫方式開啟管道,卡住

int main()

printf("open fifo p1 for read success!\n");

close(fd);

return 0;

}

2.以只寫方式開啟同乙個管道檔案

#include#include#include#include#include#include#include #include#include#include#include/****以唯讀方式開啟建立的管道p1,檢測阻塞方式開啟管道的過程*/

// 在第乙個例子沒有的輸出視窗沒有退出的情況下,重新開啟乙個shell視窗允許這個,兩個視窗都輸出語句

int main()

printf("open fifo p1 for read success!\n");

close(fd);

return 0;

}

linux的管道和命名管道

看了個教程,感覺還是要結合 看。管道是linux裡面程序間通訊的一種方式,其他的還有像訊號 signal 訊號量 訊息佇列 共享記憶體 套接字 socket 等。1.管道pipe int pipe int fd 2 返回值 成功,返回0,否則返回 1。引數陣列包含pipe使用的兩個檔案的描述符。fd...

Linux 命名管道FIFO

管道的乙個不足之處是沒有名字,因此,只能用於具有親緣關係的程序間通訊,在命名管 道 named pipe或fifo 提出後,該限制得到了克服。fifo不同於管道之處在於它提供一 個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中。命名管道是乙個裝置檔案,因 此,即使程序與建立fifo的程序不存在...

linux命名管道 fifo

除了建立方式,fifo檔案與管道極為相似。fifo是非匿名的管道,通過系統呼叫mkfifo 存在於檔案系統中。函式名稱 int mkfifo const char pathname,mode t mode 標頭檔案函式引數 說明pathname 建立fifo所用的路徑名 mode 指定fifo的屬性...