匿名管道只能於有血緣關係的程序,那麼倆個沒有任何關係的程序怎麼通訊,這就出現了命名管道來克服這一問題。命名管道是乙個裝置檔案,只要訪問該路徑,就能通過這個共享資源來互相通訊。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...