2009-11-06 79 views
2

我試圖使用消息隊列在Linux中兩個不相關的進程之間的通信。我知道使用公共密鑰值將允許我們在兩個不相關的進程中打開相同的消息隊列。但問題在於有時候某個系統實用程序可能已經使用了與消息隊列相對應的關鍵值。所以我正在使用IPC_CREAT | IPC_EXEL標誌確保強制創建新的消息隊列。使用不相關的進程間消息隊列

萬一msgget()返回一個錯誤,我遞增密鑰值和重試來創建新的消息隊列,直到成功爲止。現在,問題是如何將這個成功的鍵值傳遞給想要在相同的消息隊列上操作的其他不相關的進程。

我錯過了什麼嗎?有沒有人遇到過類似的問題?

回答

2

使用ftok(3)。它採用路徑名和任意整數id(只使用較低的8位,因此通常使用一個字符)並生成一個可能唯一的key_t。不能保證是唯一的,但使用id可以使用相同的路徑名,並且在發生碰撞時爲id指定增量。

典型執行如下:

主要使用ftok(3)獲取密鑰。

主要使用標誌來指定它希望新的消息隊列。出錯時,增加id並調用ftok,直到獲得合適的消息隊列。消息隊列創建時具有特定於用戶/組的權限,次級進程運行時的權限(儘可能窄,最好是進程獨有的)

二級使用ftok獲取啓動密鑰,然後使用msgget,遞增id並重復使用ftok,直到它成功獲取消息隊列密鑰。

1

IIRC,這正是該ftok(3)來解決這個問題。需要溝通的程序只需使用共同的路徑和關鍵值。我們曾經通過命令行將FIFO的名稱傳遞給我們的程序。他們會將此傳遞給ftok()以爲我們的共享內存段生成密鑰。

0

你可以簡單地進入21世紀,並使用POSIX消息隊列,而不是一個sysV的。 Posix隊列有姓名而不是不明顯的數字。在linux下,你可以掛載一個文件系統來查看它們,並用「rm」來刪除它們。