2012年3月6日 星期二

Pipe與FIFO

header file : unistd.h
int pipe(int fd[2]); 正確回傳0錯誤回傳-1
相當單純的一個函數,fd[0] 供 read,fd[1]提供write
使用於fork()的時候,通常provider關閉fd[0],只有使用fd[1],相反的comsumer則是關閉fd[1],使用fd[0],關閉pipe則是使用close()
pipe是半雙工的模式,如果要使用全雙工,richard steven建議使用兩組pipe來模擬

header file: stdio.h
FILE *popen(const char *cmd, const char *type);
int pclose(FILE *stream);
類似使用檔案一樣,只是執行一道command,然後由stdout讀入資料,或者使用寫入模式,經stdin將資料輸入command中

Pipe有兩個問題,第一個就因為file desriptor只有在程式執行間產生,也就是大致上只能適用於parent/child之間的關係,對於不相關的process就無法溝通,第二個問題是沒有權限的管理,因為設計的關係,本身不遭遇/提供這樣的情境


FIFO的設計就是用來解決這問題
header files: sys/types.h, sys/stat.h
int mkfifo(const char *pathname, mode_t mode);

由於是輸入路徑,所以只要知道檔案路徑就可以在process之間的做溝通,取得回傳值之後就可以使用open來開啟,但是FIFO不支援lseek操作,會回傳ESPIPE錯誤
關閉一樣使用close就可以,但是因為mkfifo會產生file,所以必須使用unlink()來刪除

至於FIFO還有其他的特性,如nonblock,晚點有時間再寫

沒有留言:

張貼留言