基本建立和使用
匿名管道或簡稱管道是核心管理的物件,它們作為一對檔案描述符暴露給程序,一個用於讀取終端,另一個用於寫入終端。它們是通過 pipe
(2)函式建立的:
int pipefds[2];
int result;
result = pipe(pipefds);
成功時,pipe()
在提供的陣列的索引 0 處記錄管道讀取結束的描述符,並在索引 1 處記錄寫入結束的描述符; 這些索引類似於標準流的傳統檔案描述符號。
建立了一個管道後,可以使用 POSIX I / O 函式寫入寫入端或從讀取端讀取:
過程 1:
ssize_t bytes_written = write(pipefds[1], "Hello, World!", 14);
過程 2:
char buffer[256];
ssize_t bytes_read = read(pipefds[0], buffer, sizeof(buffer));
或者,可以使用 fdopen()
將兩個管端中的一個包裹在 FILE
結構中,以便與 C stdio 函式一起使用:
FILE *write_end = fdopen(pipefds[1]);
if (write_end) {
fputs("Hello, World!");
}
管道具有有限的 I / O 緩衝區,並且對具有完整緩衝區的管道的普通寫入將被阻塞。因此,管道不是執行緒與自身通訊的安全機制,就好像寫入管道的執行緒也是從中讀取的唯一執行緒一樣,然後只要寫入阻塞該執行緒死鎖。
只要任何程序具有任一管道末端的開啟檔案描述,管道就會持續存在。close
(2)函式可用於關閉由檔案描述符表示的管道末端,fclose
(3)可用於通過纏繞在其周圍的 FILE
來關閉管道末端。