gpt4 book ai didi

c - mq_receive 抛出错误,提示消息太长

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

我是 Linux 编程新手,试图实现一个简单的消息队列工作。但是收到错误消息,说 message to long ,下面是我的代码,如果有任何更正,请提出建议。

我知道类似的问题被问了很多次,但我找不到解决我的问题的方法,因此发布了代码。

#include <stdio.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>

void* producerThRoutine (void *arg);
void* ConsumerThRoutine (void *arg);

int main()
{
int retVal = 0;
pthread_t producerThId,consumerThID;
mqd_t myMQdes;
struct mq_attr attr;

attr.mq_flags = 0;
attr.mq_maxmsg = 1024;
attr.mq_msgsize = 10;
attr.mq_curmsgs = 0;

myMQdes = mq_open("/myMessageQueue",O_CREAT | O_RDWR,S_IWUSR | S_IRUSR,&attr);
if(myMQdes == (mqd_t) -1){
perror("Message Queue creation failed\n");
exit(EXIT_FAILURE);
}

retVal = pthread_create(&producerThId,NULL,producerThRoutine,&myMQdes);
if(retVal != 0){
perror("\n producerThRoutine creation failed \n");
exit(EXIT_FAILURE);
}

retVal = pthread_create(&consumerThID,NULL,ConsumerThRoutine,&myMQdes);
if(retVal != 0){
perror("\n ConsumerThRoutine creation failed \n");
exit(EXIT_FAILURE);
}

retVal = pthread_join(producerThId,NULL);
if(retVal != 0){
perror("\n pthread_join for producer thread failed \n");
exit(EXIT_FAILURE);
}

retVal = pthread_join(consumerThID,NULL);
if(retVal != 0){
perror("\n pthread_join for consumer thread failed \n");
exit(EXIT_FAILURE);
}
mq_close(myMQdes);
mq_unlink("/myMessageQueue");
return 0;
}


void* producerThRoutine (void *arg)
{
char c;
char EOS = '\0';
int retVal;
mqd_t *pMQDes = (mqd_t *) arg;
printf("Enter the string you want to convert to upper case \n");

while( (c=getchar()) != EOF ){
if(c == '\n'){
retVal = mq_send( (*pMQDes),&EOS,sizeof(char),1);
if(retVal != 0){
perror("sending EOS to queue failed \n");
exit(EXIT_FAILURE);
}
break;
}
retVal = mq_send( (*pMQDes),&EOS,sizeof(char),1);
if(retVal != 0){
perror("sending character to queue failed \n");
break ;
}
}
}

void* ConsumerThRoutine (void *arg)
{
char msg;
int msg_priority,retVal;

mqd_t *pMQDes = (mqd_t *) arg;

while(1){
printf("\nthe converted string is : ");

retVal = mq_receive (*pMQDes,&msg,sizeof(char),&msg_priority);

    if(retVal == -1){
perror("mq_receive failed");
exit(EXIT_FAILURE);
}
if( msg == '\0')
{
break;
}
putchar(toupper(msg));
}
}

最佳答案

我刚刚检查了 mq_receive 的手册页,其中一个错误如下所示:

EMSGSIZE
msg_len was less than the mq_msgsize attribute of the message queue.

我改变了

retVal = mq_receive (*pMQDes,&msg,sizeof(char),&msg_priority);

retVal = mq_receive (*pMQDes,&msg,1024 * sizeof(char),&msg_priority);

其中 1024 是您设置的 mq_msgsize。然后错误就消失了。

关于c - mq_receive 抛出错误,提示消息太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44663645/

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