Linux程序間通訊

2021-07-11 05:57:46 字數 3027 閱讀 1288

一、程序間通訊概述程序通訊有如下一些目的:

a、資料傳輸:乙個程序需要將它的資料傳送給另乙個程序,傳送的資料量在乙個位元組到幾m位元組之間

b、共享資料:多個程序想要操作共享資料,乙個程序對共享資料的修改,別的程序應該立刻看到。

c、通知事件:乙個程序需要向另乙個或一組程序傳送訊息,通知它(它們)發生了某種事件(如程序終止時要通知父程序)。

d、資源共享:多個程序之間共享同樣的資源。為了作到這一點,需要核心提供鎖和同步機制。

e、程序控制:有些程序希望完全控制另乙個程序的執行(如debug程序),此時控制程序希望能夠攔截另乙個程序的所有陷入和異常,並能夠及時知道它的狀態改變。linux 程序間通訊(ipc)以下以幾部分發展而來:早期unix程序間通訊、基於system v程序間通訊、基於socket程序間通訊和posix程序間通訊。unix程序間通訊方式包括:管道、fifo、訊號。system v程序間通訊方式包括:system v訊息佇列、system v訊號燈、system v共享記憶體、posix程序間通訊包括:posix訊息佇列、posix訊號燈、posix共享記憶體。

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

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

(2)訊號(signal)

(3)訊息佇列

(4)共享記憶體

(5)訊號量

(6)套接字(socket)

二、管道通訊

普通的linux shell都允許重定向,而重定向使用的就是管道。例如:ps | grep vsftpd .管道是單向的、先進先出的、無結構的、固定大小的位元組流,它把乙個程序的標準輸出和另乙個程序的標準輸入連線在一起。寫程序在管道的尾端寫入資料,讀程序在管道的道端讀出資料。資料讀出後將從管道中移走,其它讀程序都不能再讀到這些資料。管道提供了簡單的流控制機制。程序試圖讀空管道時,在有資料寫入管道前,程序將一直阻塞。同樣,管道已經滿時,程序再試圖寫管道,在其它程序從管道中移走資料之前,寫程序將一直阻塞。管道主要用於不同程序間通訊。

管道建立與關閉建立:

乙個簡單的管道,可以使用系統呼叫pipe()。它接受乙個引數,也就是乙個包括兩個整數的陣列。如果系統呼叫成功,此陣列將包括管道使用的兩個檔案描述符。建立乙個管道之後,一般情況下程序將產生乙個新的程序。

管道的讀寫:

管道主要用於不同程序間通訊。實際上,通常先建立乙個管道,再通過fork函式建立乙個子程序。

管道讀寫注意事項:可以通過開啟兩個管道來建立乙個雙向的管道。但需要在子理程中正確地設定檔案描述符。必須在系統呼叫fork()中呼叫pipe(),否則子程序將不會繼承檔案描述符。當使用半雙工管道時,任何關聯的程序都必須共享乙個相關的祖先程序。因為管道存在於系統核心之中,所以任何不在建立管道的程序的祖先程序之中的程序都將無法定址它。而在命名管道中卻不是這樣。

三、訊號

訊號概述訊號是軟體中斷。訊號(signal)機制是unix系統中最為古老的程序之間的能信機制。它用於在乙個或多個程序之間傳遞非同步訊號。很多條件可以產生乙個訊號。

a、當使用者按某些終端鍵時,產生訊號。在終端上按delete鍵通常產生中斷訊號(sigint)。這是停止乙個已失去控制程式的方法。

b、硬體異常產生訊號:除數為0、無效的儲存訪問等等。這些條件通常由硬體檢測到,並將其通知核心。然後核心為該條件發生時正在執行的程序產生適當的訊號。例如,對於執行乙個無效儲存訪問的程序產生乙個sigsegv。

c、程序用kill(2)函式可將訊號傳送給另乙個程序或程序組。自然,有些限制:接收訊號進和傳送訊號程序的所有都必須相同,或傳送訊號程序的的所有者必須是超級使用者。

d、使用者可用kill(id 值)命令將訊號傳送給其它程序。此程式是kill函式的介面。常用此命令終止乙個失控的後台程序。

e、當檢測到某種軟體條件已經發生,並將其通知有關程序時也產生訊號。這裡並不是指硬體產生條件(如被0除),而是軟體條件。例如sigurg(在網路連線上傳來非規定波特率的資料)、sigpipe(在管道的讀程序已終止後乙個程序寫此管道),以及sigalrm(程序所設定的鬧鐘時間已經超時)。

核心為程序生產訊號,來響應不同的事件,這些事件就是訊號源。主要訊號源如下:(1)異常:程序執行過程中出現異常

(2)其它程序:乙個程序可以向另乙個或一組程序傳送訊號;

(3)終端中斷:ctrl-c,ctro-\等;

(4)作業控制:前台、後台程序的管理;

(5)分配額:cpu超時或檔案大小突破限制;

(6)通知:通知程序某事件發生,如i/o就緒等;

(7)報警:計時器到期;

常用的訊號:sighup:從終端上發出的結束訊號;sigint:來自鍵盤的中斷訊號(ctrl+c)sigquit:來自鍵盤的退出訊號;sigfpe:浮點異常訊號(例如浮點運算溢位);sigkill:該訊號結束接收訊號的程序;sigalrm:程序的定時器到期時,傳送該訊號;sigterm:kill命令生出的訊號;sigchld:標識子程序停止或結束的訊號;sigstop:來自鍵盤(ctrl-z)或除錯程式的停止掃行訊號

可以要求系統在某個訊號出現時按照下列三種方式中的一種進行操作。

(1)忽略此訊號。大多數訊號都可使用這種方式進行處理,但有兩種訊號卻決不能被忽略。它們是:sigkill和sigstop。這兩種訊號不能被忽略的,原因是:它們向超級使用者提供一種使程序終止或停止的可靠方法。另外,如果忽略某些由硬體異常產生的訊號(例如非法儲存訪問或除以0),則程序的行為是示定義的。

(2)捕捉訊號。為了做到這一點要通知核心在某種訊號發生時,呼叫乙個使用者函式。在使用者函式中,可執行使用者希望對這種事件進行的處理。如果捕捉到sigchld訊號,則表示子程序已經終止,所以此訊號的捕捉函式可以呼叫waitpid以取得該子程序的程序id以及它的終止狀態。

(3)執行系統預設動作。對大多數訊號的系統預設動作是終止該程序。每乙個訊號都有乙個預設動作,它是當程序沒有給這個訊號指定處理程式時,核心對訊號的處理。有5種預設的動作:

(1)異常終止(abort):在程序的當前目錄下,把程序的位址空間內容、暫存器內容儲存到乙個叫做core的檔案中,而後終止程序。

(2)退出(exit):不產生core檔案,直接終止程序。

(3)忽略(ignore):忽略該訊號。

(4)停止(stop):掛起該程序。

(5)繼續(contiune):如果程序被掛起,剛恢復程序的動行。否則,忽略訊號。

Linux程序間通訊

程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...