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