É possível listar filas abertas do SysV em certos arquivos?

1

Eu tenho um conjunto de aplicativos que se comunicam entre si usando filas SysV. No entanto, quando eu paro o aplicativo, algumas vezes as filas são deixadas abertas, o que, por sua vez, causa problemas na próxima vez que eu iniciar o aplicativo.

Para resolver isso, quero excluir as filas deixadas abertas, mas para saber quais filas excluir, eu gostaria de poder listar quais filas estão associadas a um arquivo específico. Isso é possível fazer?

A fila é criada usando o seguinte código (simplificado):

    key_t key;
    int q_id;

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

Então, associado a um arquivo, significa o caminho usado na chamada ftok .

    
por Kotte 12.03.2013 / 10:14

1 resposta

1

Eu acho que sua melhor aposta, é escrever um programa que chama ftok, para obter a chave, algo como:

#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;
}

Depois de ter essa chave, você pode usá-la para remover a fila de mensagens: ipcrm -Q <key> . Alternativamente, você pode modificar o programa acima para chamar msgctl(3) para remover a fila de mensagens.

    
por 12.03.2013 / 15:19