程序通訊之命名管道 FIFO

2021-08-01 07:59:26 字數 1886 閱讀 9141

匿名管道只能於有血緣關係的程序,那麼倆個沒有任何關係的程序怎麼通訊,這就出現了命名管道來克服這一問題。命名管道是乙個裝置檔案,只要訪問該路徑,就能通過這個共享資源來互相通訊。fifo是按照先進先出的原則工作的,第乙個被寫入的資料第乙個先被讀出。fifo可被用於複製序列管道命令之間的輸出流,於是也就不需要寫資料到中間磁碟檔案中(類似於使用管道以避免中間的磁碟檔案);

命名管道的建立:

mkfifo命令建立管道:

mknod命令建立管道:

mknod [option]... name type [major minor]     

option 有用的就是 -m 了     

name   自定義    

type   有 b (塊裝置),c(字元裝置), p(管道)     

mknod是比較老的函式,經常使用的是mkfifo(更加簡單和規範)這裡著重理解mkfifo這個函式。

filename為建立命名管道的全路徑名,比如在當前路徑下建立乙個名為mypipe的管道,filename的值為"./mypipe"

建立管道:

命名管道的使用:

與匿名管道的使用方法基本是相同的,不過使用命名管道時需要先呼叫open()開啟;呼叫open時需要注意的是,呼叫open()開啟命名管道的程序可能會被阻塞,但如果同時用讀寫方式(o_rdwr)開啟,則不一定會導致阻塞;如果以唯讀方式(o_rdonly)/(o_wronly)開啟,則呼叫open()函式的程序會將被阻塞直到有寫/讀方式開啟管道;

接下來會建立兩個程序來驗證沒有血緣關係的兩個程序通訊;

程序1:

#include#include#include#include#include#includeint main() //client read

char buf[100];

memset(buf,'\0',sizeof(buf));

while(1)

printf("sever:%s\n",buf);

} close(fd);

return 0;

}

程序2:

#include#include#include#include#include#includeint main() //sever write

int fd = open("./mypipe",o_wronly);

if(fd < 0)

char buf[100];

memset(buf,'\0',sizeof(buf));

while(1)

//sleep(1);

} close(fd);

return 0;

}

兩程序通訊:

命名管道是乙個可見的檔案,因此,它可以用於任何兩個程序間進行通訊。

程序通訊 命名管道 FIFO

一.命名管道 fifo fifo不同於管道之處在於它提供一 個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中。命名管道是乙個裝置檔案,因 此,即使程序與建立fifo的程序不存在親緣關係,只要可以訪問該路徑,就能夠通過fifo 相互通訊。值得注意的是,fifo rst input rst out...

程序間通訊 管道 命名管道 FIFO

比較類似程序間的生產者 消費者模型。乙個程序向管道中寫入資料,另乙個程序從管道中讀出資料。pipe為無名管道,提供的是一組半雙工通訊方式。pipe會建立兩個檔案物件,乙個索引節點。pipe在核心中會有乙個快取,快取大小可能若干個頁大小。呼叫write像管道裡寫資料時,系統會將資料存於快取,另乙個執行...

Linux程序間通訊 命名管道fifo

服務端負責讀取管道中資料並將其列印出來 fifo pipe server.c include include include include include include include include include include include define buf len pipe buf...