現在linux使用的程序間通訊方式包括:1.管道(pipe)和有名管道(fifo)
2.訊號(signal)
3.訊息佇列
4.共享記憶體
5.訊號量
6.套接字(socket)
管道通訊:
管道是單向的、先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序(寫程序)在管道的尾部寫入資料,另乙個程序(讀程序)從管道的頭部讀出資料。
資料被乙個程序讀出後,江背從管道中刪除,其它讀程序將不能再讀到這些資料。管道提供了簡單的流控制機制,程序試圖讀空管道時,程序將阻塞。同樣,管道已經滿時,程序再試圖向管道寫入資料,程序將阻塞。
管道包括無名管道和有名管道兩種,前者用於父程序和子程序間的通訊,後者可用於執行於同一系統中的任意兩個程序間的通訊。
無名管道由pipe()函式建立:
int pipe(int filedis[2]);
當乙個管道建立時,它會建立兩個檔案描述符:filedis[0]用於讀管道,filedis[1]用於寫管道。
#include
#include
#include
#include
int main()
else
printf("pipe create success\n");
close(pipe_fd[0]);
close(pipe_fd[1]);
}
管道讀寫:
管道用於不同程序間通訊。通常先建立乙個管道,再通過fork函式建立乙個字程序,該子程序會繼承父程序所建立的管道。
注意事項:必須在系統呼叫fork()前呼叫pipe(),否則子程序不會繼承檔案描述符。
命名管道:
命名管道和無名管道基本相同,但也有不同點:無名管道只能由父子程序使用;但是通過命名管道,不相關的程序也能交換資料。
例:
#include
#include
int mkfifo(const char*pathname,mode_t mode);
pathname:fifo檔名
mode:屬性(見檔案操作章節)
一旦建立了乙個fifo,就可用open開啟它,一般的檔案訪問函式(close,read,write等)都可用於fifo
訊號通訊:訊號機制是unix系統中最為古老的程序間通訊機制,很多條件可用產生乙個訊號。
1.當使用者按某些按鍵時,產生訊號。
2.硬體異常產生訊號:除數為0、無效的儲存訪問等等。這些情況通常由硬體檢測到,將其通知核心,然後核心產生適當的訊號通知程序,例如,核心對正訪問乙個無效儲存區的程序產生乙個sigsegv訊號。
3.程序用kill函式將訊號傳送給另乙個程序。
4.使用者可用kill命令將訊號傳送給其他程序。
Linux 管道通訊
一 定義 管道是單向的 先進先出的。它將乙個程式的輸入和另乙個程式的輸出連線起來。資料被乙個程序讀出後,將被從管道中刪除。分為無名和有名管道兩種。前者用於父程序和子程序間的通訊,後者用於同一系統的兩個程序間通訊。二 無名管道 int pipe int fd 2 其中,fd 0 用於讀管道,fd 1 ...
Linux管道通訊
現在在linux 中使用較多的程序間通訊方式主要有以下幾種。1 管道 pipe 及有名管道 named pipe 管道可用於具有親緣關係程序間的通訊,有名管道,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊。2 訊號 signal 訊號是在軟體層次上對中斷機制的一種模擬,它是比較複雜的通訊...
linux 管道通訊
無名管道 1 管道是半雙工的,只能支援資料的單向流動 兩程序間需要通訊時需要建立起兩個管道 2 使用無名管道通訊的程序必須擁有公共祖先程序 pipe 1 標頭檔案 include 2 定義函式 int pipe int filedes 2 3 函式說明 pipe 會建立管道,並將檔案描述詞由引數fi...