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)
삭제 메시지 대기열을 호출할 수도 있습니다.