程序間通訊 有名管道

2021-07-14 18:07:11 字數 1787 閱讀 3205

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 無名管道 管道是半雙工的,資料只能向乙個方向流動 需要雙方通訊時,需要...