程序間通訊(三)

2021-08-24 18:49:40 字數 2164 閱讀 2088

管道呼叫

我們已經了解了高層的popen函式,現在我們繼續來了解低層的pipe函式。這個函式提供了乙個在兩個函式之間傳遞資料的方法,而不必呼叫shell來解釋所請求的命令的。同時他也為我們提供了更多的資料讀寫控制。

pipe函式的原型如下:

#include

int pipe(int file_descriptor[2]);

pipe函式接受乙個兩個整數檔案描述符的陣列作為引數。他會使用兩個新的檔案描述符來填充這個資料並且返回乙個零值。如果失敗則會返回-1並且設定errno來指明失敗原因。linux手冊頁中所定義的錯誤如下:

emfile:程序正在使用的檔案描述符過多

enfile:系統檔案表已滿

efault:檔案描述符不可用

返回的兩個檔案描述符以乙個特殊的方式相連線。任何寫入file_descriptor[1]的資料可以由file_descriptor[0]中讀取。資料以先進先出的方式進行處理,通常簡記為fifo。這就意味著如果我們向file_descriptor[1]中寫入位元組1,2,3,那麼由file_descriptor[0]中的讀取就會產生1,2,3。這與堆疊不同,後者以後進先出的方式進行操作,通常簡記為lifo。

注意:在這裡我們要清楚,這些是檔案描述符,而不是檔案流,所以我們必須使用低層的read與write呼叫來訪問資料,而不是fread與fwrite。

下面的程式,pipe1.c,使用pipe來建立乙個管道。

試驗--pipe函式

#include

#include

#include

#include

int main()

exit(exit_failure);

}當我們執行這個程式,我們會得到下面的輸出:

$ ./pipe1

wrote 3 bytes

read 3 bytes: 123

工作原理

這個程式使用兩個檔案描述符file_pipes來建立乙個管道。然後他使用檔案描述符file_pipes[1]向管道中寫入資料,並且由file_pipes[0]中讀取。注意管道有內部緩衝,從而可以在兩個呼叫write與read之間儲存資料。

我們應該清楚嘗試使用file_pipes[0]寫入資料,或是使用file_pipes[1]讀取資料的效果是未定義的,所以這樣的行為結果會非常奇怪,並且也許會毫無警告的發生改變。在作者的系統上,這樣的呼叫會失敗並且返回-1,這至少保證了是很容易捕獲這個錯誤的。

粗看起來這個管道的例子似乎並沒有為我們提供任何我們使用乙個簡單的檔案不能完成的任務。管道的真正優點在我們希望在兩個程序之間傳遞資料時才會體現出來。正如我們在第12章所看到的,當乙個程式使用fork呼叫建立乙個新程序時,以前開啟的檔案描述符會保持開啟。通過在原始程序中建立乙個管道,然後通過fork建立乙個新程序,我們可以由乙個程序向另乙個程序傳遞資料。

試驗--使用fork的管道

1 這是pipe2.c。這個程式的開始部分與第乙個例子類似,直到我們呼叫fork。

#include

#include

#include

#include

int main()

2 我們已經保證fork正常工作,所以如果fork_result等於0,我們是在子程序中:

if(fork_result == 0)

3 否則,我們一定在父程序中:

else

}exit(exit_success);

}當我們執行這個程式,我們得到與前面一樣的輸出:

$ ./pipe2

wrote 3 bytes

read 3 bytes: 123

我們也許會發現實際上命令提示符會在輸出的最後部分之前出現,但是我們在這裡已經對輸出進行整理從而使其更易於閱讀。

工作原理

首先這個程式使用pipe呼叫建立乙個管道。然後他使用fork呼叫來建立乙個新的程序。如果fork呼叫成功,父程序就會向管道寫入資料,而子程序由管道中讀取資料。父子程序都會在乙個簡單的write與read之後退出。如果父程序在子程序之前退出,我們就會看到shell提示符出現在兩個輸出之間。

儘管這個程式與前面的管道例子十分相似,但是我們已經通過使用單獨的程序用於讀寫而向前進了一大步.

程序間通訊(三)

管道呼叫 我們已經了解了高層的popen函式,現在我們繼續來了解低層的pipe函式。這個函式提供了乙個在兩個函式之間傳遞資料的方法,而不必呼叫shell來解釋所請求的命令的。同時他也為我們提供了更多的資料讀寫控制。pipe函式的原型如下 include int pipe int file descr...

程序間通訊(三)

管道呼叫 我們已經了解了高層的popen函式,現在我們繼續來了解低層的pipe函式。這個函式提供了乙個在兩個函式之間傳遞資料的方法,而不必呼叫shell來解釋所請求的命令的。同時他也為我們提供了更多的資料讀寫控制。pipe函式的原型如下 include int pipe int file descr...

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...