是否可以列出某些文件上打开的 SysV 队列?

是否可以列出某些文件上打开的 SysV 队列?

我有一套使用 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)删除消息队列。

相关内容