程序間通訊 linux

2022-10-04 13:21:04 字數 1836 閱讀 1236

程序間通訊

1,使用共享記憶體

共享記憶體允許兩個或更多程序共享一給定的儲存區。因為資料不需要在各個程序之間複製,所以這是最快的一種程序間通訊方式。

通過mmap()可以將檔案對映到不同的程序空間中,將他們作為多個程序共享的記憶體實現程序間通訊。

利用mmap 進行程序間的資訊互動是無格式的,可以自己定義struct來實現格式資訊的傳遞。

例程採用自定義的mesg結構傳遞資訊

typedef struct mesg;

傳遞3個資訊,第乙個是」message head.」,第二個是使用者定義的命令列引數(這裡是12321),第三個是「message end」。

程式mmapsend負責發出資訊,mmapget負責接受並列印資訊,使用完共享記憶體後,兩個程序都取消對映,並列印報告。以下為執行效果:

mmapsend

mmapget

注:在實際執行時需要將**中proc_path "/home/coztein/mmapt"的檔案改為當前使用者目錄下可建立的檔名。

在執行mmapget時可能存在讀寫許可權的問題,可以在root使用者下執行。

2,使用訊息佇列

訊息佇列是乙個存放在核心中的訊息鍊錶,每個訊息佇列由訊息佇列識別符號標識。訊息佇列存放在核心中,只有在核心重啟(即作業系統重啟)或者顯示地刪除乙個訊息佇列時,該訊息佇列才會被真正刪除。

訊息佇列是隨著核心的存在而存在的,每個訊息佇列在系統範圍內對應惟一的鍵值。要獲得乙個訊息佇列的描述符,只需提供該訊息佇列的鍵值即可,該鍵值通常由函式ftok返回。使用msgget()可以建立或得到乙個已知訊息佇列的id,通過msgsnd()來傳送訊息,向訊息佇列傳送訊息時,必須組成合理的資料結構,採用linux系統定義的模板資料結構msgbuf。

通過msgget()可以讀取訊息。在訊息佇列中的訊息一旦被讀取就會自動消失。,同一種類按照先進先出的順序。

例程採用msgsend和msgget兩個程式來演示資訊的傳遞。

msgsend從輸入終端讀到字串輸入後建立訊息佇列,將訊息傳出。msgget通過同一路徑獲取相同的訊息佇列id,從佇列中讀取訊息。在讀到終端輸入end後,兩個程序都退出。

執行結果如下:

msgsend

msgget

注:在實際執行時需要將**中proc_path "/home/coztein"的檔案改為當前使用者目錄。

3,使用訊號量

訊號量又稱為訊號燈,訊號燈與其他程序間通訊方式不大相同,它主要提供對程序間共享資源訪問控制機制。相當於記憶體中的標誌,程序可以根據它判定是否能夠訪問某些共享資源,同時,程序也可以修改該標誌。除了用於訪問控制外,還可用於程序同步。

訊號燈有以下兩種型別:

二值訊號燈:最簡單的訊號燈形式,訊號燈的值只能取0或1,類似於互斥鎖。

注:二值訊號燈能夠實現互斥鎖的功能,但兩者的關注內容不同。訊號燈強調共享資源,只要共享資源可用,其他程序同樣可以修改訊號燈的值;互斥鎖更強調程序,占用資源的程序使用完資源後,必須由程序本身來解鎖。

計算訊號燈:訊號燈的值可以取任意非負值(當然受核心本身的約束)。

訊號燈是隨核心持續的,只有在核心重起或者顯示刪除乙個訊號燈集時,該訊號燈集才會真正被刪除。

通過semget()可以建立或獲取已存在訊號燈集的id,通過semop()可以增加或減小訊號燈的值,相應於對共享資源的釋放和占有。通過semctl()函式,實現對訊號燈的各種控制操作包括獲取/設定訊號燈資訊,刪除訊號燈集等等。

例程採用父子程序對同乙個資源的互斥訪問來顯示訊號燈的工作情況。

程式執行起來後可以發現父程序首先占用了資源,此時子程序只能等待,到父程序釋放資源後子程序立刻占用了資源,然後子程序釋放資源並退出。

父程序等到子程序退出後便刪除了訊號燈集。

執行結果如下:

sema

Linux環境程序間通訊

在訊號 上 中,討論了linux訊號種類 如何安裝乙個訊號以及對訊號集的操作。本部分則首先討論從訊號的生命週期上認識訊號,或者巨集觀上看似簡單的訊號機制 程序收到訊號後,作相應的處理,看上去再簡單不過了 在微觀上究竟是如何實現的,也是在更深層次上理解訊號。接下來還討論了訊號程式設計的一些注意事項,最...

程序間通訊方法比較

win32應用程式中程序間通訊方法分析與比較 1 程序與程序通訊 程序是裝入記憶體並準備執行的程式,每個程序都有私有的虛擬位址空間,由 資料以及它可利用的系統資源 如檔案 管道等 組成。多程序 多執行緒是windows作業系統的乙個基本特徵。microsoft win32應用程式設計介面 appli...

Linux中的守護程序cron程序

439小遊戲 剛開始的時候對於後台程序,守護程序,以及cron程序的關係根本沒弄清楚,現在了解了。就像我前面的文字裡面寫的 後台程序 執行時無須使用者輸入的程式。可以在諸如 unix linux 之類的多工作業系統上執行多個後台程序,而使用者則與前台程序互動 例如,資料輸入 有些後台程序 例如守護程...