msgrcv error : Identifier removed(ERMID)错误解决;

今天在学习进程间通信中的消息队列的时候,自己的一个例子经常出现msgrcv error : Identifier removed这个错误,网上找了,发现好多人都与到过这问题,但是并没又给初一个明确的解决办法;后来终于给找出来了,原来是类型的问题:
#include <unistd.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>   
#include <errno.h>  
#include <sys/msg.h>
 #define MAX 1024
struct mymsg{
    long int msgtype;
    char buf[MAX];
};



int main()
{
    int msg_type = 1;

    int msgid = -1;
    struct mymsg my_msg;
    long int msgtype = 1;
//    my_msg.msgtype = 1;

    if((msgid = msgget((key_t)1234,0666|IPC_CREAT)) < 0){
        fprintf(stderr,"msgget error:%s\n",strerror(errno));
        return -1;
    }else if(msgid == 0){
        printf("create msg%d success\n",msgid);
    }

    while(1){
        int size =0;
        if((size = msgrcv(msgid,(void *)&my_msg , MAX, 1 ,0)) < 0){  //注意,这里的我类型是直接填1
            fprintf(stderr,"msgrcv error :%s\n",strerror(errno));
            return -1;
        }
        my_msg.buf[size] = '\0';
        printf("receive from msgqueue :%s\n",my_msg.buf);
    }
    
        if(msgctl(msgid,IPC_RMID,0) < 0){
            fprintf(stderr,"msgctnl error :%s\n",strerror(errno));
            return -1;
       }
  
}
这样老是出现msgrcv error : Identifier removed

 把1改成(long int)1,强制转换成长整型1就行了



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
msgrcv 函数用于从消息队列中接收消息。它的使用方法如下: ```c #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); ``` 参数说明: - `msqid`:消息队列的标识符,可以通过调用 `msgget` 函数获取。 - `msgp`:指向接收消息的缓冲区的指针。 - `msgsz`:接收消息缓冲区的大小(字节数)。 - `msgtyp`:要接收的消息的类型,可以指定为特定类型或使用 IPC_NOWAIT、MSG_NOERROR 等选项。 - `msgflg`:接收消息的选项标志,可以使用 IPC_NOWAIT、MSG_NOERROR 等选项。 调用 `msgrcv` 函数之后,如果接收成功,返回值为接收到的消息的长度(字节数);如果发生错误,返回值为-1,并设置适当的错误代码。 以下是一个示例代码,演示了如何使用 msgrcv 函数接收消息: ```c #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdio.h> struct message { long mtype; char mtext[100]; }; int main() { key_t key; int msgid; struct message msg; // 创建或获取消息队列 key = ftok("msgqfile", 'A'); msgid = msgget(key, 0666 | IPC_CREAT); // 接收消息 if (msgrcv(msgid, &msg, sizeof(msg.mtext), 1, 0) == -1) { perror("msgrcv error"); return -1; } printf("Received message: %s\n", msg.mtext); return 0; } ``` 请注意,上述示例中的代码仅涵盖了基本的消息接收部分,您可能需要根据实际需求进行修改和补充。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值