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)
削除メッセージキューを呼び出すこともできます。