我有一套使用 SysV 队列相互通信的应用程序。但是,当我停止应用程序时,有时会有队列保持打开状态,这反过来会在我下次启动应用程序时导致问题。
为了解决这个问题,我想删除保持打开状态的队列,但要知道要删除哪些队列,我希望能够列出哪些队列与特定文件关联。这可以吗?
使用以下(简化的)代码创建队列:
key_t key;
int q_id;
key = ftok("/some/file/name", 42);
q_id = msgget(key, 0666 | IPC_CREAT);
因此,与文件关联意味着ftok
调用中使用的路径。
答案1
我认为你最好的选择是编写一个调用 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)
删除消息队列。