Linux下程序間通訊(小結)上

2021-06-08 18:24:20 字數 2308 閱讀 7692

之所以程序間需要通訊,包括進行資料傳輸、資源共享、通知事件和程序控制等等。

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

一、管道

1、這裡主要指無名管道,具有如下特點:

#、只能用於具有親緣關係的程序之間通訊。

#、是乙個半雙工通訊模式,具有固定的讀寫端,先進先出。

#、可以看成是一種特殊的檔案,可以使用普通的read()等函式,但是它不是普通檔案,不屬於任何檔案系統,並且只存在於核心的記憶體空間中。

#、資料被讀出後,將從管道中刪除,其他讀程序將不能再讀到這些資料。

2、管道是基於檔案描述符的通訊方式,管道建立時,建立兩個檔案描述符fd[0]、fd[1],fd[0]固定用於讀管道,fd[1]固定用於寫管道。關閉管道只需要用close將兩個檔案描述符逐個關閉即可。建立管道可以呼叫pipe()來實現,語法要點如下:

實際應用中,通常是先建立乙個管道,然後通過fork()建立乙個子程序,它會繼承父程序所建立的管道,就可以實現父子程序之間的讀寫操作。由於父子程序執行的次序不能保證,所以可以呼叫sleep()函式。另外,應該呼叫waitpid()函式來保證父子程序的同步。

二、有名管道(fifo)

有名管道突破了無名管道的限制,可以在互不相關的程序間進行通訊。它在檔案系統中是可見的,可當成普通檔案進行讀寫操作,嚴格遵循先進先出原則,不支援如lseek()等檔案定位操作。有名管道可以用mkfifo()函式建立,語法要點如下:

開啟fifo時,非阻塞標誌(o_nonblock)將對以後的讀寫產生影響:

#、沒有使用o_nonblock:訪問要求無法滿足時程序阻塞,如試圖讀取空的fifo,將導致程序阻塞。

#、使用o_nonblock:訪問要求無法滿足時不阻塞,立刻出錯返回,errno是enxio。

三、訊號

訊號是在軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式。訊號可以直接進行使用者空間程序和核心程序之間的互動,核心程序也可以利用它來通知使用者空間程序發生了哪些系統事件。使用者程序對訊號的相應有三種方式,即忽略訊號(注:sigkill、sigstop不能被忽略)、捕捉訊號和執行預設操作。

下面列舉幾種常見的訊號:

@sighup:從終端上發出的結束訊號

@sigint:來自鍵盤的中斷訊號(ctrl+c)

@sigkill:該訊號結束接受訊號的程序

@sigterm:kill命令發出的訊號

@sigchld:標識子程序停止或結束的訊號

@sigstop:來自鍵盤(ctrl+z)或除錯程式的停止執行訊號

@sigalrm:當乙個定時器到時的時候發出訊號

1、訊號的傳送與捕捉

a、kill()和raise()

它們不僅可以傳送終止訊號,也可以向程序傳送其他訊號,raise()只允許程序向自身傳送訊號。

函式語法要點如下:

b、alarm()和pause()

alarm()可以在程序設定乙個定時器,當指定時間到時,向程序傳送sigalarm訊號,需要注意的是,乙個程序只能有乙個鬧鐘時間,如果呼叫alarm之前已為程序設定過鬧鐘時間,而且沒有超時,則被新值所代換。

pasue()用於將呼叫程序掛起直到捕捉到訊號為止,通常用於判斷訊號是否已到。

2、訊號的處理

訊號處理主要兩種方式,一種使用簡單的signal()函式,另一種是使用訊號集函式組。主要介紹訊號處理函式。

首先該函式原型指向乙個無返回值並且帶乙個整形引數的函式指標,接著該原型帶有兩個引數,其中第二個引數可以是使用者自定義的訊號處理函式的函式指標。linux還支援乙個更新的訊號處理函式sigaction()

linux下程序間通訊

linux下程序間通訊的幾種主要手段簡介 管道 pipe 及有名管道 named pipe 管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊 訊號 signal 訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發...

Linux下程序間通訊

linux下的程序通訊基本上是從unix平台上的程序通訊繼承來的。而對unix發展做出最大貢獻的倆大主力at t的貝爾實驗室及bsd 加州大學伯克利分校的伯克利軟體發布中心 在程序的通訊方面的側重點有所不同。前者是對unix早期的程序間通訊手段進行了系統的改進和擴充,形成了 system v ipc...

linux下程序間通訊(2)

1.訊息佇列 訊息佇列是由訊息的鍊錶,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少 管道只能承載無格式位元組流以及緩衝區大小受限等缺點。2.訊息佇列結構定義 struct msqid ds msgque msgmni 向量 msgque msgmni 是乙個msqid ds結構...