关于Linux系统消息队列中出现的msgsnd与msgrcv使用出现的问题分析:
1:msgsnd出现identifier removed:
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
说明msqid出现了问题,查找之上找到问题是:
红线处在创建时,括号写错到后面,由于C语言中优先级的问题,从而导致出错
改为:
成功;所以说,写代码要小心,这里出错很不容易发现。
2:msgrcv出现identifier removed问题
#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就行了