gpt4 book ai didi

c - 消息太长 - 缓冲区大于消息大小

转载 作者:行者123 更新时间:2023-11-30 15:02:34 24 4
gpt4 key购买 nike

我正在尝试自学消息队列,并且我正在使用相互通信的 pthreads。我知道 mq_receive 中的缓冲区应该大于 attr.mq_msgsize,而且它是(大小的两倍)。我还没发消息呢。

编辑:John Bollinger 在他的机器上运行了这个并且它有效。这可能是与操作系统相关的问题。我正在运行 Mint 18 XFCE

编辑编辑:重新启动修复了该行为吗?不会质疑或提示。

此代码基于我在网上找到的示例:https://github.com/arembedded/mq_example

这是代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <fcntl.h>
#include <errno.h>


using namespace std;

#define PIN_MSG_NAME "/pin_msg"
#define DB_MSG_NAME "/db_msg"

#define MESSAGE_QUEUE_SIZE 15

pthread_t ATM;
pthread_t DB_server;
pthread_t DB_editor;
void* run_ATM(void* arg);
void* run_DB(void* arg);

static struct mq_attr mq_attribute;
static mqd_t PIN_MSG = -1;

void sig_handler(int signum){
//ASSERT(signum == SIGINT);
if (signum == SIGINT){
cout << "killing application" << endl;

pthread_cancel(ATM);
pthread_cancel(DB_server);
pthread_cancel(DB_editor);
}
}

int main(int argc, char const *argv[])
{
pthread_attr_t attr;

signal(SIGINT, sig_handler);

mq_attribute.mq_maxmsg = 10; //mazimum of 10 messages in the queue at the same time
mq_attribute.mq_msgsize = MESSAGE_QUEUE_SIZE;

PIN_MSG = mq_open(PIN_MSG_NAME , O_CREAT | O_RDWR, 0666, &mq_attribute);
if (PIN_MSG == -1){
perror("creating message queue failed ");
}

pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 1024*1024);

long start_arg = 0; //the start argument is unused right now
pthread_create(&ATM, NULL, run_ATM, (void*) start_arg);
pthread_create(&DB_server, NULL, run_DB, (void*) start_arg);

pthread_join(ATM, NULL);
pthread_join(DB_server, NULL);

sig_handler(SIGINT);
}

void* run_ATM(void* arg) {
int status;
char accountNumber[15];
char PIN[15];

cout << "ATM is running" << endl;
cout << "Please input an account number > ";
cin >> accountNumber;
status = mq_send(PIN_MSG, accountNumber, sizeof(accountNumber) + 1, 1);
if (status < 0){
perror("sending message failed");
}
}

void* run_DB(void* arg){
cout << "Database server running" << endl;
int status;
char received_acct_number[30];

while(1){
status = mq_receive(PIN_MSG, received_acct_number, sizeof(received_acct_number), NULL);
if (status < 0){
perror("error:");
} else {
cout << received_acct_number << endl;
}
}
}

我错过了什么吗?为什么会有消息传入,为什么消息太大?

最佳答案

您谈论接收缓冲区大小时就好像错误是由 mq_receive() 报告的,但正如您所观察到的,您的缓冲区足够长,可以接收可以在队列中排队的任何消息,而且,您似乎根本没有期待收到消息。

虽然我不确定您如何会以这种方式感到困惑,但我倾向于认为问题发生在发送消息中:

char accountNumber[15];

...

status = mq_send(PIN_MSG, accountNumber, sizeof(accountNumber) + 1, 1);

您的队列的消息长度限制为 15 字节,而您正在尝试将 16 字节的消息排入队列。此外,您的发送缓冲区实际上首先小于 16 个字节;如果 mq_send() 尝试复制 16 字节的消息,则会产生未定义的行为。

关于c - 消息太长 - 缓冲区大于消息大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40997829/

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