Msgsnd в c: разрешение отклонено

Я пытаюсь создать очередь сообщений, а затем отправить в нее сообщение. Вот что я пробовал:

int main(){
    int myMsgQueue;
    struct msgStruct{
        long mtype;
        char mtext[LENGTH];
    };
    struct msgStruct myMsg; 
    myMsg.mtype = (long)getpid();
    strcpy(myMsg.mtext,"Hey there"); //Setting the string of the message

    if((myMsgQueue = msgget(IPC_PRIVATE,IPC_CREAT | IPC_EXCL)) == -1) //Creating the message queue
        errore(__LINE__);
    if(msgsnd(myMsgQueue,&myMsg,sizeof(myMsg) - sizeof(long),0) == -1) //Sending the message
        errore(__LINE__);
    if(msgctl(myMsgQueue,IPC_RMID,0) == -1) //Deleting the message queue
        errore(__LINE__);
}

Функция errore просто выводит строку, которая объясняет ошибку, используя strerror(errno).
Однако этот код, похоже, не работает: errore печатает "Отказано в доступе " поскольку msgsnd возвращает -1.
Я не могу понять, в чем проблема: я инициализирую очередь сообщений и адекватную структуру сообщения, затем создаю сообщение типа, соответствующего pid процесса, и текста, соответствующего "Привет", затем отправка сообщения.
Что я упустил?


person Stubborn    schedule 18.11.2018    source источник
comment
Вы упускаете что-то очень важное в msgget(). Обратите особое внимание на его документацию.   -  person Shawn    schedule 18.11.2018
comment
@Shawn Вы правы, я заметил, что я также должен указать разрешения для очереди во втором операторе!   -  person Stubborn    schedule 18.11.2018


Ответы (1)


Прочитайте справочную страницу справочную страницу.

Для ключа аргумента существует идентификатор очереди сообщений, но разрешение на операцию, указанное младшими 9 битами msgflg, не будет предоставлено;

person amin saffar    schedule 18.11.2018