程序通訊 程序管道

2021-06-25 19:48:31 字數 2476 閱讀 3901

程序間通訊的幾種常用方式:

管道、命名管道、訊號、訊號量、共享記憶體、訊息佇列、套接字。

管道( pipe ):一種半雙工的通訊方式,資料只能單向流動且只能在具有共同祖先的程序間使用。

命名管道 (name pipe):也是一種半雙工的通訊方式,但他允許不相關程序間的通訊。

訊號( sinal ):乙個程序通過訊號通知其他程序某事件已經發生,其他程序的反應如何及何時反應他都不管。

訊號量( message queue ):訊號量只是乙個計數器,通過控制多個程序對共享資源的訪問實現用於程序同步。

共享記憶體( shared memory ) :共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由乙個程序建立,但多個程序都可以訪問。共享記憶體是最快的 ipc 方式,它是針

對其他程序間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號兩,配合使用,來實現程序間的同步和通訊。

訊息佇列( message queue ) : 訊息佇列是由訊息的鍊錶,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小

受限等缺點。

套接字( socket ) : 套解口也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同及其間的程序通訊。

以上**:

教材:linux程式設計(第三版) neil mathhew richard stones

一.程序管道

最簡單的兩個程序之間的傳遞資料的方法就是使用popen、pclose。

#include

file *popen(const char *command,const char *open_mode);

int pclose(file *stream_to_close);

popen通過command呼叫另乙個程式並傳遞引數。open_mode是管道的開啟方式,只能是"r"或"w",因此不能同時進行讀寫;如果要實現雙向通訊,最普通的方法是同時開啟兩個管道分別負責乙個方向的資料流。

pclose不再使用該管道時,可以用它關閉。

乙個例子:

#include #include #include #include int main()

pclose(read_fp);

exit(exit_success);

}exit(exit_failure);

}

程式執行的結果是將ps -ax命令(也就是執行ps程式,引數是ax)的結果寫入管道,再從管道讀出來顯示在終端。

二.pipe呼叫

上例中popen要通過shell來解釋ps ax命令,呼叫ps程式,pipe則可以省過這一步並提供更多的控制。

#include

int pipe(int file_descroptor[2]);

pipe函式在往它的引數中填入兩個檔案描述符,成功返回0,失敗返回-1並設定errno以表明失敗原因。

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

enfile:系統的檔案表已滿

efault:檔案描述符無效

pipe()使用兩個檔案描述符以一種特殊的方式連線起來。寫到int file_descroptor[1]的所有資料都可以從int file_descroptor[0]以先進先出的方式讀出來。

這裡使用的是檔案描述符而不是流,因此不用fread/fwrite,而是使用底層的read/write 。

例子:

#include #include #include #include int main()

if( 0 == fork_result )            //建立子程序成功,返回0表示我們在子程序中

else // 建立子程序成功,返回子程序號(這裡沒有表現具體程序號,僅用非-1且非0表示),表示我們在父程序中

}exit(exit_failure);

}

這個程式用兩個檔案描述符 file_pipes建立乙個管道,父程序向 file_pipes[1]寫入資料,子程序從 file_pipes[0]讀出。

三.一些細節的處理

將管道用作標準輸入輸出

到此,我們一直讓讀程序簡單的讀取一些資料然後直接退出,且假設不用手動清理使用過的資源。但大多數從標準輸入輸出請填寫資料的程式用的是另一種做法,通常它們並不知道有多少資料要讀寫而往往用迴圈的方法:讀取-處理-讀取...沒有資料可讀時,read呼叫阻塞,如果另一邊管道關閉,就讓read返回乙個0。

可以使用檔案描述符複製函式將標準輸入/輸出作為管道檔案描述符:

#include

int dup(int file_descriptor);

dup函式開啟乙個新的檔案描述符,與引數file_descriptor指向同乙個檔案(或管道),新檔案描述符總是取最小值--如果在呼叫dup函式前關閉了輸入流,那麼它返回新描述符就是0,因為新描述符與引數中的描述符指向同一檔案或管道,所以標準輸入流改為指向乙個我們傳遞給dup函式的引數對應的檔案或管道。

程序通訊之管道通訊

管道通訊有乙個特點 通訊是半雙工的,即管道的一端只能讀或者只能寫 管道通訊可以分為 匿名管道通訊和命名管道通訊兩種 1.匿名管道通訊 適合用於父子程序間的通訊 include include include 匿名管道通訊,本機父子程序通訊方式 int main else waitpid pid,nu...

程序通訊 管道通訊

程序間通訊 目的 資料傳輸 乙個程序需要將它的資料傳送給另乙個程序 資源共享 多個程序之間共享同樣的資源 通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知它們發生了某種事件 程序控制 有些程序希望完全控制另乙個程序的執行 如debug程序 此時控制程序希望能夠攔截另乙個程序的所有操作,並能夠及...

程序通訊 管道通訊

自己的理解,首先要區分概念 管道和管道通訊 所謂 管道 是指用於連線乙個讀程序和乙個寫程序以實現它們之間通訊的乙個共享檔案,又名pipe檔案 是一種特殊的檔案,這就意味著你可以向操作檔案一樣操作無名管道,無名管道在核心中對應的是一段特殊的記憶體空間,這段記憶體空間由作業系統進行管理,對使用者是不可見...