linux中管道 pipe 一談

2021-08-04 18:13:33 字數 2735 閱讀 6463

/*****

*****

*****

*****

*****

*****

*****

*****

*******

管道(pipe)是linux上程序間通訊的一種方式,其是半雙工(資料流只能在乙個方向上流動(還需要經過核心),及要麼是接收,要麼是傳送),並且只能在父子程序 或 具有公共祖先的兩個子程序間通訊。

管道(pipe)一般是在呼叫fork函式之前呼叫pipe函式建立,這樣的話,fork後子程序將得到父程序的兩個管道描述符副本(相當於呼叫了兩次dup)。

/*****

*****

*****

*****

*****

*****

*****

*****

*******

#include

int pipe(int fd[2])

返回值:成功返回0,失敗返回-1

*****

*****

*****

*****

*****

*****

*****

*****

*******/

注意: 函式執行成功後為引數返回兩個描述符,fd[0]為讀而打 開,fd[1]為寫而開啟

使用管道有幾點注意事項:

1.當讀(read)乙個寫(write)端已經關閉的管道,程式(read)將讀完管道中所有資料後返回0。

2.當寫(write)乙個讀(write)端已經關閉的管道,將產sigpip訊號,程式(write)返回-1,並將錯誤碼置為epipe

3.如果管道中資料為空,則(read)將永久堵塞直到有資料或寫(write)端關閉。

4.如果管道已被資料填滿,則(write)將會堵塞直到管道中有空與空間 或 寫端(read)關閉,(管道容量可用fpathconf函式得到,使用_pc_pipe_buf引數)。

*****

*****

*****

*****

*****

*****

*****

*****

*******/

例項1:

使用管道實現 ls -l | wc -c 操作

分析: 執行ls -l後其結果將會被列印到終端(即使用到stdout_fileno)標準輸出,wc -c(統計單詞數量)是從標準輸入中得到內容(即使用到stdin_fileno)然後進行統計。

思路: 子程序中呼叫exec函式族執行ls -l命令,並呼叫dup2函式將子程序中的fd[1]描述符複製為標準輸出(stdout_fileno),這用的話,但向標準輸出中寫資料是就等同於向管道中寫資料。

對於父程序則呼叫exec函式族執行wc -c命令,然後呼叫dup2將fd[0]複製為標準輸入,

例項**:

#include #include #include #include int main(int argc, char **argv)

/**呼叫fork函式建立子程序**/

if ((pid = fork()) < 0) else

if (0 == pid)

close(fd[1]);

}execlp("ls", "ls", "-l", null);

exit(exit_success);

} //sleep(2);

close(fd[1]);

if (fd[0] != stdin_fileno)

close(fd[0]);

}execlp("wc", "wc", "-c", null);

/****子程序的退出狀態,避免產生僵死程序**/

if (waitpid(pid, null, 0) < 0)

return exit_success;

}

例項2:

實現分頁功能 即more命令

#include #include #include #include #define page "/bin/more"

#define maxline 1024

int main(int argc, char **argv)

if ((fp = fopen(argv[1], "r")) == null)

if (pipe(fd) < 0)

if ((pid = fork()) < 0) else

if (0 == pid)

}if (ferror(fp))

fclose(fp);

close(fd[1]);

}close(fd[1]);

if (fd[0] != stdin_fileno)

close(fd[0]);

}/***得到page對應的環境引數***/

if ((page = getenv("page")) != null) else

/***strrchr函式判斷'\'字元,

*在arg字串中最後一次出現的位置

**/if ((temp = strrchr(arg, '/')) != null) else

execl(arg, temp, null);

if (waitpid(pid, null, 0) < 0)

return exit_success;

}

linux管道通訊(pipe)

linux pipe適合於父子程序之間進行通訊。如下面 所示 include include include int main create sub process pid fork if 1 pid else if 0 pid else return 0 當呼叫fork函式後,fork將會返回兩個...

linux 匿名管道pipe

管道是一種最基本的ipc機制,由pipe函式建立 include int pipe int filedes 2 呼叫pipe函式時在核心中開闢一塊緩衝區 稱為管道 用於通訊,它有乙個讀端乙個寫端,然後通 過filedes引數傳出給使用者程式兩個檔案描述符,filedes 0 指向管道的讀端,file...

linux管道pipe詳解

管道是一種最基本的ipc機制,作用於有血緣關係的程序之間,完成資料傳遞。呼叫pipe系統函式即可建立乙個管道。有如下特質 1.其本質是乙個偽檔案 實為核心緩衝區 2.由兩個檔案描述符引用,乙個表示讀端,乙個表示寫端。3.規定資料從管道的寫端流入管道,從讀端流出。管道的原理 管道實為核心使用環形佇列機...