因此,程序的工作方式如下。有一个生产者和4个消费者。生产者生成6个随机数,然后通过消息队列将其发送到4个消费者中。每个消费者都会收到它们,并立即
在终止之前,应通过另一个队列发送可能产生= 0的消息; mayproduce是一个整数。

有问题的功能是:

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);


我用这样的功能发送可能产生

msgsnd(qid,&mayproduce,sizeof(int),0)


当我编译时显示“无效参数”。

如果我将mayproduce更改为其他数字,对于mayproduce = 2,该程序将正常运行。

有人知道它不接受0作为参数的原因吗?

代码示例:

mayproduce=2; // if I put 0 here it doesn't work
if(msgsnd(msq2,&mayproduce,tamanho,0)<0) {
   perror("\nConsumidor:Erro ao enviar a mensagem: ");
   exit(1);
}

最佳答案

msgsnd()文档指出:


   The msgp argument is a pointer to a caller-defined
    structure of the following general form:

       struct msgbuf {
           long mtype;       /* message type, must be > 0 */
           char mtext[1];    /* message data */
       };



手册页上有很多信息,您需要非常非常仔细地阅读。

因此,您实际上不应该将指针发送给int。您应该创建自己的结构,其中1.成员的类型为long,并用作消息类型区分符,接收方可以查看该消息类型以确定接收到的消息类型。

传递给msgsend()的大小是mtype成员之后发送的所有内容的大小。

当您执行msgsnd(qid,&mayproduce,sizeof(int),0)时,将发生以下情况:


mayproduce int被解释为mtype中的struct msgbuf成员,如文档所述,它不能为0
sizeof(int)表示除long msgtype之外还将有一个int。但是您的&mayproduce指针仅指向单个int,因此您可能还会发送从堆栈中获取的垃圾值。


您应该执行以下操作:

struct MyMsg {
     long mtype;
     int mayproduce;
};

struct MyMsg msg;
msg.mtype = 1; //or whatever you want > 0
msg.mayproduce = ....; //whatever you want to send.
size_t msgsize = sizeof(struct MyMsg) - sizeof(long);

msgsnd(msq2,&msg,msgsize,0);

08-16 20:41