Вопрос

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

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 Создание: разрешение запрещено». Есть идеи?

Это было полезно?

Решение

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

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

Другие советы

Ваша ошибка кажется EACCES и не EEXIST. Отказ Моя страница My Linux говорит:

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

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

Вы используете текущий каталог как путь для ftok. Отказ Может быть, измените в простой локальный файл в «/ TMP», а не в домашней папке (NFS?).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top