Linux

是否可以在某些文件上列出打開的 SysV 隊列?

  • March 12, 2013

我有一套使用 SysV 隊列相互通信的應用程序。但是,當我停止應用程序時,有時會有隊列處於打開狀態,這反過來又會導致我下次啟動應用程序時出現問題。

為了解決這個問題,我想刪除打開的隊列,但要知道要刪除哪些隊列,我希望能夠列出哪些隊列與特定文件相關聯。這可能嗎?

隊列是使用以下(簡化的)程式碼創建的:

   key_t key;
   int q_id;

   key = ftok("/some/file/name", 42);
   q_id = msgget(key, 0666 | IPC_CREAT);

因此,與文件關聯意味著ftok呼叫中使用的路徑。

我認為您最好的選擇是編寫一個呼叫 ftok 的程序,以獲取密鑰,例如:

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>

int main(int argc, char **argv)
{
   unsigned long long key;
   if (argc != 3) {
       printf("Usage %s: [path] [id]\n" ,argv[0]);
       return 1;
   }
   key = ftok(argv[1], atoi(argv[2]));
   printf("%llx\n", key);
   return 0;
}

擁有此密鑰後,您可以使用它來刪除消息隊列:ipcrm -Q <key>。或者,您可以修改上面的程序以呼叫msgctl(3)以刪除消息隊列。

引用自:https://unix.stackexchange.com/questions/67640