특정 파일에 대해 열려 있는 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)삭제 메시지 대기열을 호출할 수도 있습니다.

관련 정보