mkfifo test
這條命令建立了乙個名字為 test 的命名管道。
接下來我們用乙個程序向這個管道裡面寫資料,然後有另外乙個程序把裡面的資料讀出來。
echo "this is a pipe" > test // 寫資料
這個時候管道的內容沒有被讀出的話,那麼這個命令就會一直停在這裡,只有當另外乙個程序把 test 裡面的內容讀出來的時候這條命令才會結束。接下來我們用另外乙個程序來讀取
cat < test // 讀資料
我們可以看到,test 裡面的資料被讀取出來了。上一條命令也執行結束了。
從上面的例子可以看出,管道的通知機制類似於快取,就像乙個程序把資料放在某個快取區域,然後等著另外乙個程序去拿,並且是管道是單向傳輸的。
這種通訊方式有什麼缺點呢?顯然,這種通訊方式效率低下,你看,a 程序給 b 程序傳輸資料,只能等待 b 程序取了資料之後 a 程序才能返回。
所以管道不適合頻繁通訊的程序。當然,他也有它的優點,例如比較簡單,能夠保證我們的資料已經真的被其他程序拿走了。
下面我們來看**實現:
實現環境
ubuntu16.4和mac 10.14.6
writefifo.c
#include #include #include #include #include #include #include #include #define fifo "myfifo"
#define buff_size 1024
int main(int argc, char *argv)
sscanf(argv[1], "%s", buff);
//測試fifo是否存在,若不存在,mkfifo乙個fifo
if(access(fifo, f_ok) == -1)
}//呼叫open以只寫方式開啟fifo,返回檔案描述符fd
if((fd = open(fifo, o_wronly)) == -1)
//呼叫write將buff寫到檔案描述符fd指向的fifo中
if((nwrite == write(fd, buff, buff_size)) > 0)
close(fd);
printf("hello world!\n");
return 0;
}//write is client
readfifo.c
#include #include #include #include #include #include #include #include #define fifo "myfifo"
#define buff_size 1024
int main()
}//以唯讀方式開啟fifo,返回檔案描述符fd
if((fd = open(fifo, o_rdonly)) == -1)
// 呼叫read將fd指向的fifo的內容,讀到buff中,並列印
while(1)
}close(fd);
printf("hello world!\n");
return 0;
}//read is server
//乙個服務端可以對多個客戶端
//
執行結果:
參考:
程序間通訊 有名管道
無名管道,由於沒有名字,只能用於親緣關係的程序間通訊.為了克服這個缺點,提出了有名管道 fifo fifo不同於無名管道之處在於它提供了乙個路徑名與之關聯,以fifo的檔案形式存在於檔案系統中,這樣,即使與fifo的建立程序不存在親緣關係的程序,只要可以訪問該路徑,就能夠彼此通過fifo相互通訊,因...
程序間通訊 管道(有名管道)
前幾天我們簡單的介紹了程序間通訊的一種渠道 管道,我們有說道管道的概念,管道的通訊原理,還提到了管道的兩種型別 有名管道和無名管道,今天我們就來說說有名管道吧 基本概念 有名管道在檔案目錄中有乙個檔案標示 管道檔案 實際不佔據磁碟空間。資料快取在記憶體上 只有使用時記憶體才開闢,由於在記憶體上,因此...
程序間通訊 有名管道 無名管道
顧名思義,管道就像是將資料放入到乙個長長的管子中一樣,肯定會有一端寫入資料,稱為寫端,有一段讀出資料,稱為讀端。既然是說像管子一樣那麼它肯定有大小吧,資源不是無窮無盡的,預設下管道的大小是64k,用ulimit a 可以檢視。1 無名管道 管道是半雙工的,資料只能向乙個方向流動 需要雙方通訊時,需要...