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,晚點有時間再寫
沒有留言:
張貼留言