Pipe 小註解

[PIPE]

Pipe 可以產生 process 與 process 之間的通道 (interprocess channel). 這根水管需要連通兩個 process, 所以 pipe 就需要兩個輸入參數 (fildes = file descriptors).

讀端為 fld descriptor[0], 寫端為 fld descriptor[1]. 反過來用的話, 並沒有定義 (unspecified). 讀端和寫端是用 FIFO 的方式讀寫.

它被視為一種進階或是 low level 的 IO 方式. 關閉的時候使用 close(), 使用 read()、write() 來存取資料.

[FIFO]
採用 mkfifo 建立一個 FIFO, FIFO 順利開成之後, 就可以用 open(FIFO_NAME, mode) 這種低階 IO 方式處理.
 
[POPEN], PHP 也有同名 function

用 popen 來打開, 相對用 pclose 來關閉. 用起來的感覺很像是開關一個 file. 因此它被視為基本或是 formatted Piping.

這個類似檔案的 pipe 打開之後, 就可以用 fprintf()、fscanf() 、fread()、fwrite() 來存取資料

PIPE/POPEN/FIFO 的實例

http://bantolinux.blogspot.com/2007/05/pipe-fifo-api-v1.html

http://fanqiang.chinaunix.net/a4/b7/20010808/0900001087_b.html

[Exercise]
比較特別的地方是, 雖然以上都把 pipe 當作 file 來用, 但是它真的是一個 process.
static char *process1="ls -al > dump1″;
static char *process2="rm *";
static char *process3="echo abc > text1″;
……
handle1 = popen(process1,"w");
fprintf(handle1, “%s", process3);
fflush(handle1);
handle2 = popen(process2, “w");
……
這個執行結果會是怎麼樣呢?

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

%d 位部落客按了讚: