Linux學習(管道通訊)

2021-07-24 04:23:33 字數 2179 閱讀 4704

現在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...