Linux 程序間通訊方式(1)

2021-10-03 21:06:39 字數 2734 閱讀 9051

現在linux使用的程序間通訊方式包括:

1、管道(pipe)和有名管道(fifo)

2、訊號(signal)

3、訊息佇列

4、共享記憶體

5、訊號量

6、套接字

在linux中,管道是一種使用頻繁地通訊機制,從本質上說,管道也是一種檔案,但他又和普通檔案有所不同,管道可以克服使用檔案進行通訊的兩個問題。

(1) 限制管道的大小。管道是乙個有著固定大小的緩衝區。其值為4k,因此管道被塞滿的時候,就會出現問題。比如對管道的write()呼叫會預設的被阻塞,等待某些資料被讀取。

(2) 都區程序也可能工作的比寫程序快。當所有當前程序被讀取時,管道會變空,這種情況下,隨後而來的read()呼叫會預設的被阻塞,等待某些資料被寫入。

管道是單向的,先進先出的,他把乙個程式的輸出和另乙個程式的輸入連線在一起。

從管道讀資料是一次性操作,資料一旦被讀取,他就從管道中消失,釋放空間以便於寫更多的資料。

無名管道的建立:int pipe(int file[2]);

當乙個管道建立時,它會建立兩個檔案描述符:file[0]用於讀管道,

file[1]用於寫管道

必須在系統呼叫fork()之前呼叫pipe(),否則子程序將不會繼承檔案描述符。

返回值: 若成功則返回零,否則返回-1,錯誤原因存於errno中。

#include

intmain()

int pid =

fork()

;//子程序讀取管道中的資料

if(pid==0)

}//父程序將資料寫入管道

if(pid >0)

}return0;

}

定義函式: int mkfifo(const char * pathname, mode_t mode );

pathname為需要建立的檔案路徑,引數mode為該檔案的許可權(umask值)

mkfifo ()會依引數pathname建立特殊的fifo檔案,該檔案必須不存在

一旦建立了乙個fifo,就可以用open開啟它 。

返回值:若成功則返回0,否則返回-1,錯誤原因存於errno中。

將資料寫入有名管道

#include

#include

intmain()

int fd = open (path,o_wronly)

;while(1

)return0;

}

從有名管道中讀取資料

#include

#include

#include

intmain()

close

(fd)

;}

對於linux來說,實際訊號是軟中斷,許多重要程式都需要處理訊號。訊號為linux提供了一種處理非同步事件的方法。

每個訊號都有乙個名字和編號,這些名字都以"sig"開頭。

訊號定義在signal.h標頭檔案中,訊號名都定義為正整數。

具體的訊號名稱可以使用kill -l來檢視,訊號是從1開始編號

常見的訊號有:

int中斷、 quit退出、 kill強制退出、term終止、stop暫停。

1、當使用者按某些按鍵時產生訊號

2、硬體產生異常時產生訊號,

3、程序用kill函式將訊號傳送給另乙個程序

4、使用者可以用kill系統命令將訊號傳送給其他程序

kill命令就是乙個傳送訊號的工具,kill -9 pid來殺死程序

1、忽略訊號,大多數訊號可以使用這個方式來處理,但是有兩種訊號不能被忽略(sigkill和sigstop)。

2、捕捉訊號,寫乙個訊號處理函式,將這個函式告訴核心,然後核心呼叫函式,實現訊號的處理

3、系統預設動作,當發生了訊號,系統會自動執行,大部分處理方式都為直接kill掉

使用alarm函式可以設定乙個時間值(鬧鐘時間),當所設定的時間到了的時候,產生sigalrm訊號,如果不捕捉此訊號,則預設動作是終止該程序

定義:unsign int alarm(unsigned int seconds);

函式定義在unistd.h標頭檔案中

例如

#include

#include

void

handler

(int signo)

intmain()

return0;

}~

當執行程式時,陷入死迴圈,列印i的值後加1,停頓一秒後接著迴圈,alarm(10)表示在程式執行10秒時傳送乙個終止訊號,這個訊號送給了signal(sigalrm,handler),當接收到這個訊號時,執行handler所指定的函式。

每個程序只能有乙個鬧鐘時間,如果在呼叫alarm時,以前已經為該程序設定過鬧鐘時間,而且它還沒有超時,那麼以前登記過的鬧鐘時間則被新值代換。

如果有以前登記的尚未超過的鬧鐘時間,而這次seconds的值是0,則表示取消以前的鬧鐘。

1.pause函式使呼叫程序掛起,直至捕捉到乙個訊號。

2. 函式放在unistd.h標頭檔案中

3. 函式定義:int pause(),只有執行了乙個訊號處理函式後,掛起才結束。

linux 程序間通訊方式

1 無名管道通訊 無名管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2 高階管道通訊 高階管道 popen 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方式...

Linux程序間通訊方式

目錄前言 一 程序間通訊的目的 二 linux程序間通訊方式簡介 程序間的通訊就是在不同程序之間傳播或者交換資訊。程序的使用者空間是相互獨顯然可以體用這幾樣的立的,一般而言是不能互相訪問的,唯一的例外是共享空間。但是系統空間卻是 公共場所 所以核心顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪...

linux程序間通訊方式

1 管道 pipe 2 命名管道 named pipe 3 訊號 signal 4 訊息 message 佇列 5 共享記憶體 6 訊號量 semaphore 7 套接字 socket 1 管道 pipe 管道可用於具有親緣關係程序間的通訊,允許乙個程序和另乙個與它有共同祖先的程序之間進行通訊。2 ...