2013-12-14 55 views
0

我的程序使用系統msgqueue IPC的。我的代碼:爲什麼每次os重新啓動時都會自動構建msgqueue?

key = 0x0000ed79; 
    if((id=msgget(key,0666|IPC_CREAT)) <= 0) 
      return false ; 
     else return true 

的問題是:在每次機器重新啓動時

  1. ,有msgqueue自動使用相同的密鑰,但內置了ID爲0,所以我必須ipcrm它;
  2. 爲什麼我不能使用ID爲0的msgqueue?這裏是男人頁面內msgget API的返回值的描述,似乎爲0的ID是不是不正確的:

    如果成功,返回值將是消息隊列標識符(非負整數)否則-1,並將errno指示錯誤

+0

msgQs是內核持久性的,並且在重新啓動後不能存活。這裏還有別的事情要做。 – Duck

+0

msgget可能返回隊列ID爲0,沒有什麼特別的。msgget在失敗時返回-1。 (但是,如果您在重新啓動之後取回隊列標識,而您沒有自己創建隊列標識,則可能是您的密鑰與其他進程衝突) – nos

+0

@ nos.how找到哪個進程使用相同的密鑰創建隊列?tks – basketballnewbie

回答

0

如何找到哪個進程創建隊列使用相同的密鑰?

有沒有簡單的方法來找到哪個進程創建的隊列,但我們可以檢查發送或接收從隊列中最後的過程,也許創建進程是其中之一(即使不是,識別使用隊列的過程可能有幫助),例如, G。用於將對msqid

ipcs -qi0 

顯示lspid=… lrpid=… - 從所述相關聯的消息隊列中的最後進程發送的進程ID /接收消息 。

相關問題