gpt4 book ai didi

c - 消息队列不接受 0 作为参数

转载 作者:行者123 更新时间:2023-11-30 14:56:57 24 4
gpt4 key购买 nike

所以程序是这样工作的。有一个生产者和 4 个消费者。生产者生成 6 个随机数,并通过消息队列发送给 4 个消费者。每个消费者收到它们后,立即在终止之前,应该通过另一个队列发送一条可能产生=0的消息; mayproduct 是一个整数。

有问题的函数是:

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

我使用这样的函数来发送mayproduct

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

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

如果我将mayproduct更改为其他数字,对于mayproduct=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,&mayproduct,sizeof(int),0) 时,会发生以下情况:

  • mayproduct int 被解释为 struct msgbuf 中的 mtype 成员,正如文档所述,它不能为 0
  • sizeof(int) 表示除了 long msgtype 之外,您还需要一个 int。但是您的 &mayproduct 指针仅指向单个 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);

关于c - 消息队列不接受 0 作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44249447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com