В разрешении C отказано для создания очереди - PullRequest
0 голосов
/ 19 ноября 2010

Я пытаюсь создать очередь, но получаю ошибку об отказе в разрешении. Я получил эту ошибку раньше, но затем я добавил код для перехвата ошибок при создании ключа, и он работал. С тех пор я изменил только то, что я поместил свой код создания очереди в отдельную функцию. Вот как выглядит мой код:

key_t key1;
int msqid1;

int main(int arc, char *argv[])
{
        getKeys();            
        queueCreate();         
}

void getKeys()                  
{
        if ((key1 = ftok(".", '1')) == -1)  
        {
                perror("key1 creation");
                exit(1);
        }
}

void queueCreate()
{
        if ((msqid1 = msgget(key1, 0666 | IPC_CREAT)) == -1)
        {
                perror("msqid1 creation");
                exit(1);
        }
}

Выдается сообщение об ошибке: «msqid1 creation: Permission denied». Есть идеи?

Ответы [ 2 ]

2 голосов
/ 19 ноября 2010

Скорее всего, вы не уничтожили очередь сообщений в один раз, когда она была успешно создана, поэтому теперь вы не можете восстановить ее, потому что она все еще существует.

Вы не указываете, какую платформу вы используетесноваКак правило, вы используете команду ipcs для получения статуса различных систем IPC (общая память, семафоры и очереди сообщений) и ipcrm для удаления систем IPC, которые больше не нужны.

0 голосов
/ 19 ноября 2010

Кажется, ваша ошибка EACCES, а не EEXIST.Моя справочная страница linux гласит:

EACCES Для ключа существует очередь сообщений, но вызывающий процесс не имеет разрешения на доступ к очереди и не имеет возможности CAP_IPC_OWNER.

Проверяли ли вы эти условия?

Вы используете текущий каталог в качестве пути для ftok.Возможно, измените на обычный локальный файл в "/ tmp", а не в вашей домашней папке (nfs?).

...