询问 msgrcv ,不适用于根据优先级接受消息

Posted

技术标签:

【中文标题】询问 msgrcv ,不适用于根据优先级接受消息【英文标题】:asking about msgrcv , does not work for accept messages accourding priority 【发布时间】:2016-07-24 23:18:03 【问题描述】:

这是我的代码,在最后一部分中,msgrecv 不接受来自队列中的正确优先级的消息,例如:10 是最重要的接受然后 type=20 然后 type=30 ...这是我的目标就是以这种方式接受消息... 谁能告诉我问题出在哪里? 因为接受是没有优先权的.. 谢谢.. 那是代码

     #include <sys/msg.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <stdio.h>
 #include <string.h>
#include "fifo.h"
 typedef struct mymsg 
  long mtype;
  char mtext[100];
  int private;
 mymsg;

 int main()
 


  int msqid;
  mymsg msg,buff;
  msqid=msgget(6000,IPC_CREAT|0666);

  if(msqid==-1)
  perror("FAiled to create message queue\n");
  
  else
  printf("Message queue id:%u\n",msqid);
  



 //ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
int x=0 ; 
    while(1)
          int privatefifo;
          if(msgrcv(msqid,&buff,sizeof(msg)-sizeof(long),10,/*IPC_NOWAIT*/MSG_NOERROR | IPC_NOWAIT)>-1)
            x=10;
          else if(msgrcv(msqid,&buff,sizeof(msg)-sizeof(long),20,/*IPC_NOWAIT*/MSG_NOERROR | IPC_NOWAIT)>-1)
            x=20;
          else if(msgrcv(msqid,&buff,sizeof(msg)-sizeof(long),30,/*IPC_NOWAIT*/MSG_NOERROR | IPC_NOWAIT)>-1)
            x=30;




          printf("The message received is: %s , , from %d\n",buff.mtext,x);
        strcpy(msg.mtext,"i replay you");
             msg.mtype=buff.mtype;

        if(msgsnd(buff.private,&msg,sizeof(msg)-sizeof(long),0)==-1)
            perror("msgsnd failed:");
          
          else
           printf("Message sent successfully\n");
          



 

【问题讨论】:

请提供minimal reproducible example。我们至少需要看看发件人代码做了什么,您还需要解释您是如何得出“接受无优先权”的结论的。但是对于初学者,请注意msgrcv 没有“优先级”的概念。第四个参数不是优先级而是消息类型。所以你需要明确你的预期行为是什么,实际行为是什么。 【参考方案1】:

我修复了它,只是我必须在 x 的值处设置一个条件,以确保 3 个条件之一满足或没有..

【讨论】:

以上是关于询问 msgrcv ,不适用于根据优先级接受消息的主要内容,如果未能解决你的问题,请参考以下文章

JMS 消息优先级不适用于 Message

msgrcv 收到空白消息

Redis之上的分布式Java队列

C 使用 IPC 消息队列的信号使用和处理

SystemV消息队列

Linux进程间通信 -- 消息队列 msgget()msgsend()msgrcv()msgctl()