linux 管道通訊

2021-06-25 20:03:58 字數 2028 閱讀 6995

無名管道:

1)管道是半雙工的,只能支援資料的單向流動;兩程序間需要通訊時需要建立起兩個管道;

2)使用無名管道通訊的程序必須擁有公共祖先程序

pipe:

1) 標頭檔案 :

#include

2) 定義函式:

int pipe(int filedes[2]);

3) 函式說明: 

pipe()會建立管道,並將檔案描述詞由引數filedes陣列返回。

filedes[0]為管道裡的讀取端。

filedes[1]則為管道的寫入端。

4) 返回值:  

若成功則返回零,否則返回-1,錯誤原因存於errno中。

錯誤**: 

emfile

程序已用完檔案描述詞最大量

enfile

系統已無檔案描述詞可用。

efault 引數 filedes 陣列位址不合法。

pipen:

1) 標頭檔案 :

#include

2) 定義函式:

file *popen(const char *command, const char *type);
int pclose(file *stream);

3) 函式說明: 

command 引數是乙個字串指標

指向的是乙個以 null 結束符結尾的字串, 這個字串包含乙個 shell 命令. 這個命令被送到 /bin/sh 以 -c 引數執行, 即由 shell 來執行. 

type 引數也是乙個指向以 null 結束符結尾的字串的指標 

這個字串必須是 'r' 或者 'w』 來指明是讀還是寫。

stream 引數是乙個普通的 標準i/o流, stream 只能用 pclose() 函式來關閉, 而不是 fclose() 函式. 

向這個流的寫入被轉化為對 command 命令的標準輸入; 而 command 命令的標準輸出則是和呼叫 popen(), 函式的程序相同,除非這個被command命自己改變. 相反的, 讀取乙個 「被popen了的」 流, 就相當於讀取 command 命令的標準輸出, 而 command 的標準輸入則是和呼叫 popen, 函式的程序相同.注意, popen 函式的輸出流預設是被全緩衝的.

pclose() 函式等待相關的程序結束並返回 乙個 command 命令的 退出狀態, 就像 wait4 函式 一樣

有名管道:

(1)半雙工

(2)使用有名管道通訊的程序不需要有公共祖先程序

mkfifo:

1) 標頭檔案 :

#include

2) 定義函式:

int mkfifo(const char* pathname, mode_t mode);

3) 函式說明: 

pathname 引數建立的fifo路徑

mode

引數指定建立的fifo訪問模式。這個訪問會與當前程序的umask程序運算,以產生實際應用的許可權模式。

4) 返回值:  

若成功則返回0, 否則返回-1, 錯誤原因存於errno 中.

錯誤**:

eaccess

引數pathname 所指定的目錄路徑無可執行的許可權

eexist

引數pathname 所指定的檔案已存在.

enametoolong

引數pathname 的路徑名稱太長.

enoent

引數pathname 包含的目錄不存在

enospc

檔案系統的剩餘空間不足

enotdir

引數pathname 路徑中的目錄存在但卻非真正的目錄.

erofs

引數pathname 指定的檔案存在於唯讀檔案系統內.

Linux 管道通訊

一 定義 管道是單向的 先進先出的。它將乙個程式的輸入和另乙個程式的輸出連線起來。資料被乙個程序讀出後,將被從管道中刪除。分為無名和有名管道兩種。前者用於父程序和子程序間的通訊,後者用於同一系統的兩個程序間通訊。二 無名管道 int pipe int fd 2 其中,fd 0 用於讀管道,fd 1 ...

Linux管道通訊

現在在linux 中使用較多的程序間通訊方式主要有以下幾種。1 管道 pipe 及有名管道 named pipe 管道可用於具有親緣關係程序間的通訊,有名管道,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊。2 訊號 signal 訊號是在軟體層次上對中斷機制的一種模擬,它是比較複雜的通訊...

Linux 管道通訊

一 通訊的意義 1 傳輸資料 程序之間的通訊 2 共享資源 不同程序之間共享同一資源 3 事件通知 乙個程序向另乙個或另一組程序傳送訊息通知 4 程序控制 如debug程序等需要完全控制另乙個程序的執行,即能攔截程序操作並知曉其狀態 二 通訊的方式 1 無名管道 pipe 使用檔案操作函式 read...