程序間通訊 Linux

2022-07-20 16:54:12 字數 1424 閱讀 9485

linux程序間通訊主要方法有:管道,命名管道,訊息佇列,訊號量,共享記憶體,還有訊號和套接字socket。下面先簡單介紹下

管道:半雙工的通訊方式,資料只能單方向流動,而且只能在父子程序間使用。資料只能由乙個程序流向另乙個程序(其中乙個寫管道,乙個讀管道),如果要進行全雙工通訊,需要建立兩個管道。管道還有一些限制條件,比如管道的緩衝區大小是受限制的。管道所傳送的是無格式的位元組流,這就要求傳送和接受方需要事先約定好資料的格式。

2 命名管道:允許非親緣關係的程序間使用。

建立命名管道的系統函式有兩個:mknod和mkfifo。均定義在標頭檔案sys/stat.h中。

命名管道建立後,必須先呼叫open將其開啟。因為命名管道是乙個存在於硬碟上的檔案,而管道是存在於記憶體中的特殊的檔案。

需要注意的是,呼叫open()函式可能會被阻塞。如果用讀寫方式開啟(o_rdwr),則一定不會導致阻塞;如果是以唯讀方式開啟(o_rdonly),則呼叫open函式的程序將會被阻塞直到有寫方開啟管道;如果以寫方式開啟(o_wronly),也會阻塞到直到有讀方開啟管道。

int mkfifo(const char *pathname, mode_t mode);命名管道fifo其實就是乙個特殊的檔案file。

如果乙個pipe沒有程序去read,那麼其他程序對這個pipe進行write操作的話,會產生sigpipe訊號。而且對於乙個fifo,可以有多個寫程序,所以原子操作非常重要,如果不想很多寫程序寫的資料相互覆蓋的話。

常量pipe_buf表示系統在任意時刻在乙個fifo中可以存在的資料長度。

(1)當要寫入的資料量不大於pipe_buf時,linux將保證寫入的原子性。如果此時管道空閒緩衝區不足以容納要寫入的位元組數,則進入睡眠,直到當緩衝區中能夠容納要寫入的位元組數時,才開始進行一次性寫操作。即寫入的資料長度小於等於pipe_buf時,那麼或者寫入全部位元組,或者乙個位元組都不寫入,它屬於乙個一次性行為,具體要看fifo中是否有足夠的緩衝區。

(2)當要寫入的資料量大於pipe_buf時,linux將不再保證寫入的原子性。fifo緩衝區一有空閒區域,寫程序就會試圖向管道寫入資料,寫操作在寫完所有請求寫的資料後返回。

3 訊號量(semophore):訊號量是一種計數器,可以用來控制多個程序對共享資源的訪問。它常常作為一種鎖機制,防止某程序正在訪問共享資源的時候,其他程序也訪問該共享資源。因此可以作為程序間,或者同一程序內的不同執行緒之間的同步手段。

4 訊息佇列:訊息佇列就是訊息的鍊錶。存放在核心中,訊息佇列克服了訊號量傳遞資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限制等缺點。

5 訊號(signal):訊號是一種比較複雜的通訊方式,用於通知接受程序某個事件已經發生。

6 共享記憶體:就是對映一段能被其他程序訪問的一段記憶體,這段共享記憶體由乙個程序建立但是多個程序都可以訪問。共享記憶體是最快的ipc方式,它是針對其他ipc效率低而設計的。

7 套接字:可以再不同機器上進行程序通訊。詳情見linux網路程式設計。

Linux程序間通訊

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

Linux程序間通訊

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

Linux程序間通訊

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