Можно ли перечислить открытые очереди SysV для определенных файлов?

У меня есть набор приложений, которые общаются друг с другом с помощью очередей SysV. Однако, когда я останавливаю приложение, иногда очереди остаются открытыми, что в свою очередь вызывает проблемы в следующий раз, когда я запускаю приложение.

Чтобы решить эту проблему, я хочу удалить оставшиеся очереди, но чтобы знать, какие очереди для удаления, я хотел бы указать, какие очереди связаны с определенным файлом. Возможно ли это сделать?

Очередь создается с использованием следующего (упрощенного) кода:

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

Поэтому, связанный с файлом, означает путь, используемый в вызове ftok .

One Solution collect form web for “Можно ли перечислить открытые очереди SysV для определенных файлов?”

Я думаю, что ваш лучший выбор – написать программу, которая вызывает 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) чтобы удалить очередь сообщений.

Linux и Unix - лучшая ОС в мире.