почему очередь сообщений не создана - PullRequest
0 голосов
/ 21 марта 2019

Я изучаю очереди сообщений, написал код для создания очереди сообщений

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdlib.h>
#include <errno.h>

int main()
{
    key_t key;
    int msgid;

    key = ftok("proj", 64);
    if (key == -1) {
        perror("ftok failed");
        exit(1);
    }
    printf("key:%x\n", key);
    //IPC_CREAT: creating message queue if not exists
    msgid = msgget(key, IPC_CREAT);
    if (msgid == -1) {
        perror("msgget failed");
        printf("errno:%d\n", errno);
        if (errno == ENOENT)
            printf("No message queue exists for key and msgflg did not specify IPC_CREAT\n");
        exit(2);
    }
    printf("msgid:%x\n", msgid);


    return 0;
}

При выполнении команды не отображается вывод: ipcs -q

panther2@ubuntu:~/c_codes/msg_queue$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    

Не могли бы вы, ребята, скажите, пожалуйста, мнеесли я делаю какую-либо ошибку

1 Ответ

1 голос
/ 21 марта 2019

Как я вижу, в вашем коде нет ничего плохого, но поведение действительно странное, даже в моей системе.

Когда mssget возвращает 0, все в порядке (должно возвращаться неотрицательное числокоторый 0) и очередь может быть использована.

Я добавил for(;;); в конце вашей проги и запустил ее снова.ipcs теперь показывает:

0x4025077b 0 круд 0 0 0

После того, как я ipcrm -q 0 и снова запустил программу, я получал новый идентификатор для каждого запуска.Теперь я удалил бесконечный цикл, и все и все по-прежнему работает, при каждом запуске я получаю очередь сообщений с другим номером, которую мне всегда приходится уничтожать перед следующим запуском.

Это действительно странно!

Я нашел много отчетов на эту тему, например: https://www.unix.com/programming/248572-msgget-2-returns-0-workaround-fix.html http://forums.codeguru.com/showthread.php?403036-strange-problem-in-using-msgget%28%29-in-Linux

Держите нас в курсе, если вы нашли правильное решение!

Поскольку моя система теперь генерирует при каждомзапустить новую очередь сообщений с идентификатором> 0, я больше не могу воспроизвести это поведение.Я не хотел перезагружаться снова;)

...