基本建立和使用

匿名管道或簡稱管道是核心管理的物件,它們作為一對檔案描述符暴露給程序,一個用於讀取終端,另一個用於寫入終端。它們是通過 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 來關閉管道末端。