一、程序間通訊概述
程序間通訊:在使用者空間實現程序通訊是不可能的,通過linux核心通訊
1.資料傳輸 : 乙個程序需要將它的資料傳送給另乙個程序
2.資源共享 :多個程序之間共享同樣的資源
3.通知事件 :乙個程序需要向另乙個或一組程序傳送訊息,通知它們發生了某種事件
4.程序控制 :有些程序希望完全控制另乙個程序的執行(如debug程序),此時控制程序希望能夠攔截另乙個程序的所有操作,並能夠及時知道它的狀態改變
二、現在linux使用的程序間通訊方式包括:
1、管道(pipe)和有名管道(fifo)
2、訊號(signal)
3、訊息佇列
4、共享記憶體
5、訊號燈
6、套接字(socket)
三、管道通訊
1、管道是單向的、先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。
2、檔案io中的open函式不能建立管道檔案,只能用pipe函式來建立管道。
3、無名管道建立:int pipe(int filedis[2]);
當乙個管道建立時,它會建立兩個檔案描述符:
filedis[0] 用於讀管道,
filedis[1] 用於寫管道
4、 管道用於不同程序間通訊。通常先建立乙個管道,再通過fork函式建立乙個子程序,該子程序會繼承父程序所建立的管道
5、必須在系統呼叫fork( )前呼叫pipe( ),否則子程序將不會繼承檔案描述符
6、命名管道和無名管道基本相同,但也有不同點:
無名管道只能由父子程序使用;
但是通過命名管道,不相關的程序也能交換資料
7、int mkfifo(const char * pathname, mode_t mode)
pathname:fifo檔名
mode:屬性(見檔案操作章節)
一旦建立了乙個fifo,就可用open開啟它,一般的檔案訪問函式(close、read、write等)都可用於fifo
四、訊號通訊
1、訊號(signal)機制是unix系統中最為古老的程序間通訊機制,很多條件可以產生乙個訊號:
1、當使用者按某些按鍵時,產生訊號
2、硬體異常產生訊號:除數為0、無效的儲存訪問等等。這些情況通常由硬體檢測到,將其通知核心,然後核心產生適當的訊號通知程序,例如,核心對正訪問乙個無效 儲存區的程序產生乙個sigsegv訊號
3、程序用kill函式將訊號傳送給另乙個程序
4、使用者可用kill命令將訊號傳送給其他程序
2、sigkill\sigstop。
這兩種訊號不能被忽略的原因是:
它們向超級使用者提供了一種終止或停止程序的方法
3、執行使用者希望的動作
通知核心在某種訊號發生時,呼叫乙個使用者函式。在使用者函式中,執行使用者希望的處理
4、 執行系統預設動作
對大多數訊號的系統預設動作是終止該程序
5、使用alarm函式可以設定乙個時間值(鬧鐘時間),當所設定的時間到了時,產生sigalrm訊號.如果不捕捉此訊號,則預設動作是終止該程序
6、pause函式使呼叫程序掛起直至捕捉到乙個訊號。
#include
int pause(void)
只有執行了乙個訊號處理函式後,掛起才結束
7、1、sig_ign:忽略此訊號
2、sig_dfl: 按系統預設方式處理
3、訊號處理函式名:使用該函式處理
Linux程序間通訊1
1.linux下程序間通訊方式有有那些?1 管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2 有名管道 named pipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。3 訊號量 semop...
Linux 程序間通訊 1 管道
1.匿名管道 include 功能 建立匿名管道 int pipe int fd 2 引數fd 檔案描述符陣列,其中fd 0 表示讀端,fd 1 表示寫端 返回值 成功返回0,失敗返回 1管道並非屬於程序的資源,屬於作業系統,父子程序共享用於管道的檔案描述符,所以兩個程序通過作業系統提供的記憶體空間...
Linux 程序間通訊方式(1)
現在linux使用的程序間通訊方式包括 1 管道 pipe 和有名管道 fifo 2 訊號 signal 3 訊息佇列 4 共享記憶體 5 訊號量 6 套接字 在linux中,管道是一種使用頻繁地通訊機制,從本質上說,管道也是一種檔案,但他又和普通檔案有所不同,管道可以克服使用檔案進行通訊的兩個問題...