Linux
是否可以在某些文件上列出打開的 SysV 隊列?
我有一套使用 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)
以刪除消息隊列。