ошибка при создании сообщения - PullRequest
0 голосов
/ 30 апреля 2018

Я хочу создать очередь сообщений, но получаю ошибку при создании идентификатора. Может кто-нибудь предоставить мне лучшее решение для msgget по созданию идентификатора.

 msgid=msgget((key_t)1234,0666 | IPC_CREAT);

Я получаю сообщение == - 1

  #include<stdio.h>
    #include<stdlib.h>
    #include<sys/ipc.h>
    #include<sys/msg.h>
    struct msg_buf{
        long msg_type;
        char msg_txt[100];
    }message;

    int main()
    {
        //key_t key;
        int msgid;
        //key=ftok("progfile",65);
        msgid=msgget((key_t)1234,0666 | IPC_CREAT);
        if(msgid==-1)
        {
            printf("[-]Error in creating id:\n");
            exit(1);
        }
        printf("[+]MSGID created:\n");
        message.msg_type=1;
        printf("Write data:");
        scanf("%s",message.msg_txt);
        if(msgsnd(msgid,&message,sizeof(message),0)==-1)
        {
            printf("[-]Error while semnding message:\n");
            exit(1);
        }
        printf("Data send is: %s \n",message.msg_txt);
        return 0;
    }

Выход:

root@DESKTOP-UFTQBQ8:/mnt/c/Users/BRAHMA JAISWAL/Desktop# ./b
[-]Error in id creation:   

1 Ответ

0 голосов
/ 30 апреля 2018

Я хочу создать очередь сообщений, но получаю ошибку при создании идентификатора? Я не вижу ошибок в вашем коде при создании части очереди сообщений. Как только удалите очередь сообщений с помощью ipcrm -q id и снова запустите ваш код.

В качестве альтернативы вы можете использовать POSIX IPC mq_open, mq_send, mq_receive, поскольку все POSIX IPC являются поточно-ориентированными. Со страницы руководства mq_open

mq_open () создает новую очередь сообщений POSIX или открывает существующую очередь. Очередь определяется по название. Подробнее о конструкции имени см. Mq_overview (7).

Пример кода

int main(void) {
        mqd_t fd;
        char buf[30];

        printf("\nEnter message you wanna send :\n");
        fgets(buf,sizeof(buf),stdin);
        fd = mq_open("/my_mq",O_RDWR|O_CREAT,0777,NULL);
        if(fd == -1){
                perror("mq_open");
                exit(0);
        }
        if(mq_send(fd,buf,sizeof(buf),0) == -1){
                perror("mq_send");
                exit(0);
        }
        return 0;
}

Прочитайте разницу между msgget () и mq_open и Система V IPC против POSIX IPC

...