程序間通訊(ipc)學習總結
一、程序間通訊的必要性:
1、資料傳輸:乙個程序需要將它的資料傳送給另乙個程序
2、資源共享:多個程序間需要共享資源。
3、通知事件:乙個程序需要向另乙個或一組程序傳送訊息,通知它們發生了某種事件。
4、程序控制:有些程序希望完全控制另乙個程序的執行(如debug程序),此時控制程序希望能夠攔截另乙個程序的所有操作,並能夠及時知道它的狀態改變。
二、程序間通訊方式:
1、管道(pipe)和有名管道(fifo)
2、訊號(signal):用於通知接收程序有某種事件發生
3、訊息佇列:是一種訊息的鏈結表,對程序的許可權要求較高。
4、共享記憶體:可以使多個程序訪問同一塊記憶體空間,是最快的程序間通訊方式。
5、訊號量:主要是一種用於程序間以及同一程序的不同執行緒之間的同步手段。
6、套接字(socket):不同機器或者系統間的程序間通訊。
三、程序間通訊——管道
1、管道:管道是單向的、先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序(寫程序)在管道的尾部寫入資料,另乙個程序(讀程序)從管道的頭部讀出資料。
2、管道分為無名管道和命名管道。
無名管道:主要用於父程序和子程序之間的通訊。
命名管道:適用於同一系統的任意兩個程序之間的通訊。
3、無名管道
a、無名管道通過呼叫函式pipe來建立:
函式原型:int pipe(int fd[2])
函式成功返回0,否則返回-1.
標頭檔案:#include
當乙個管道建立時,它會建立兩個檔案描述符:fd[0]用於讀取管道;fd[1]用於寫入管道。一般檔案i/o函式都可以用於管道的讀寫,比如:read、write等。
注:乙個程序在由函式pipe建立乙個管道後,一般再由fork函式建立乙個子程序,然後通過無名管道進行父子程序之間的通訊。
b、無名管道的讀寫:
管道的讀取:
當管道的寫端不存在時,程式則認為讀到了資料的結尾,讀函式返回的讀出位元組數為0。
當管道的寫端存在時,讀出資料的位元組數根據管道中現有的資料位元組數決定。
管道的寫入:
只有在管道的讀端存在時,向管道寫入資料才有意義,否則,向管道寫入資料的程序將收到核心傳來的sigpipe訊號。
父子程序在執行時,它們的先後順序不能保證,為了保證父子程序關閉了相應的檔案描述符,可以使用sleep()解決。
向管道寫入資料時,管道緩衝區一有空閒區域,寫程序就會試圖向管道寫入資料,如果讀程序不讀取管道緩衝區中的資料,寫操作將會阻塞。
注意:必須在系統呼叫fork( )前呼叫pipe( ),否則子程序將不會繼承檔案描述符。
當使用半雙工管道時,任何關聯的程序都必須共享乙個相關的祖先程序。因為管道存在於系統核心之中,所以任何不在建立管道的程序的祖先程序之中的程序都將無法定址它。而在命名管道中卻不是這樣。
4、命名管道
a、命名管道通過mkfifo函式進行建立.
函式原型:int mkfifo(const char* pathname,mode_t mode)
Linux程序間通訊
程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...
Linux程序間通訊
謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...
Linux程序間通訊
謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...