msgstr创建错误

时间:2018-04-30 03:49:39

标签: c ipc message-queue

我想创建一个消息队列,但在id创建时出错。有人为我提供了一个更好的msgget创建id的解决方案。

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

我正在收到msgid == - 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 :(得分:0)

我想创建一个消息队列但在ID创建中出错?在创建消息队列部分时,我没有看到代码中的任何错误。一旦按ipcrm -q id&amp;删除邮件队列再次运行你的代码。

或者,您可以使用POSIX IPC mq_openmq_sendmq_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;
}

阅读此difference between msgget() and mq_openSystem V IPC vs POSIX IPC