消息队列 mq 发送错误。错误的文件描述符
Posted
技术标签:
【中文标题】消息队列 mq 发送错误。错误的文件描述符【英文标题】:Message queque mq send error. Bad file descriptor 【发布时间】:2021-05-22 12:28:17 【问题描述】:我正在尝试写入我的消息队列 (mq_send)。
这是我先打开队列然后写入队列的代码。
开幕式:
int MQconnect (mqd_t * mq, char * name)
//printf("hello from MQconnect\n");
do
mq=mq_open(name, O_WRONLY); //O_RDONLY
while(mq==-1);
if(mq== -1)
return 0;
else
return 1;
// Connects to an existing mailslot for writing Uses mq as reference pointer, so that you can reach the handle from anywhere/
// Should return 1 on success and 0 on fail*/
写作:
int MQwrite (mqd_t mq, void * sendBuffer) // (const char) sendBuffer
int nrOfBytes = mq_send(mq, (const char)sendBuffer, 1024, 10);
printf("\n%d", nrOfBytes);
return nrOfBytes; //nrOfBytes;
// Write a msg to a mailslot, return nr Uses mq as reference pointer, so that you can reach the handle from anywhere
// should return number of bytes read */
打开工作正常,但我无法写入消息队列。
mq_send return -1 作为返回值,错误信息是:
errno 的值:9 perror 打印的错误:错误的文件描述符 错误:错误的文件描述符
对上述函数的调用发生在这个函数中:
void * mqClient(void * arg)
pthread_mutex_lock(&mutex);
char answer[20];
mqd_t mq_on_server;
usleep(1000);
int response = MQconnect(&mq_on_server, "/servermq");
if(response==0)
printf("something went wrong with MQconnect\n");
else
//This loop continously scans planets given by the user
//while(!(0))
printf("\nWrite to mailbox: ");
scanf("%s", answer);
MQwrite (mq_on_server, &answer);
int c;
while ( (c = getchar()) != '\n' && c != EOF);
//fflush(stdout);
//
pthread_mutex_unlock(&mutex);
有人知道我为什么会收到这种错误吗?我的朋友有完全相同的代码,对他来说它正在工作。
【问题讨论】:
(mq== -1)
在while(mq==-1)
之后怎么可能是真的?
我的错。代码还不完善,会过一遍的。
关于:int nrOfBytes = mq_send(mq, (const char)sendBuffer, 1024, 10);
第二个参数应该是一个指针,而不是一个字符数组。建议:`int nrOfBytes = mq_send(mq, (const char*)sendBuffer, 1024, 10);
关于:scanf("%s", answer);
变量answer
只有20个字节,所以很容易溢出数组answer[]
为了避免这个问题,使用'max characters'修饰符19。(19因为%s
总是在输入中附加一个 NUL 字节。建议:scanf("%19s", answer);
关于:MQwrite (mq_on_server, &answer);
在 C 中,对数组的裸引用会降级为数组第一个字节的地址,因此需要删除 &
【参考方案1】:
您忘记取消引用 MQconnect
中的给定指针。
int MQconnect (mqd_t * mq, char * name)
//printf("hello from MQconnect\n");
#if 0
/* wrong part */
do
mq=mq_open(name, O_WRONLY); //O_RDONLY
while(mq==-1);
if(mq== -1)
#else
/* fixed code */
do
*mq=mq_open(name, O_WRONLY); //O_RDONLY
while(*mq==-1);
if(*mq== -1)
#endif
return 0;
else
return 1;
// Connects to an existing mailslot for writing Uses mq as reference pointer, so that you can reach the handle from anywhere/
// Should return 1 on success and 0 on fail*/
【讨论】:
我在解除引用后摆脱了错误“错误的文件描述符”,但现在我得到了一个新错误:errno 的值:14 由 perror 打印的错误:错误地址错误:错误地址 而mq_send的返回值还是-1。 您是说消息的长度为 1024,而传递的缓冲区长度仅为 20 个字节。这看起来很糟糕。 是的,我尝试将 char answer[20] 更改为 char answer[1024] 但也没有解决。关于如何防止这种情况的任何想法? @Gnoom 我投了赞成票,但因为我是 *** 的新手,所以它不会出现。以上是关于消息队列 mq 发送错误。错误的文件描述符的主要内容,如果未能解决你的问题,请参考以下文章
多次使用 socketpair 函数的文件描述符时出现“错误的文件描述符”错误