【发布时间】:2016-09-22 10:08:17
【问题描述】:
我正在尝试使用 boost 进程间消息队列将字符串内容传递给另一个进程。传递整数时没有问题,但是当我想传递 std::string 下的缓冲区时,会引发异常
boost::interprocess_exception::library_error
代码如下。 这次崩溃的原因可能是什么?
// SENDER process
//
message_queue::remove("messagequeue");
//Create a message_queue.
message_queue mq (create_only,"messagequeue",100,sizeof(char));
std::string text("ciao");
mq.send(text.data(), text.size(), 0);
sleep(100);
// RECV process
//
void get()
{
message_queue mq(open_only,"messagequeue");
unsigned int priority;
message_queue::size_type recvd_size;
std::string message;
message.resize(100);
mq.receive(&message[0], 100, recvd_size, priority);
message.resize(recvd_size);
std::cout << message << std::endl;
sleep(100000);
}
int main()
{
boost:: thread t;
t = boost::thread(get);
t.join();
return 1;
}
【问题讨论】:
-
我认为您的代码可能存在几个问题。发送
text.size()不会发送终止零。我也会避免在接收时使用message[0]构造。如果您想这样做,请改用矢量。.data()也更干净。当您将向量转换为字符串时,也不要忘记终止零。 -
同样的问题。什么也没有变。在我的代码下面。 std::vector
数据; data.push_back('c'); data.push_back('i'); data.push_back('a'); data.push_back('o'); data.push_back('\n'); mq.send(data.data(), data.size(), 0); -
@AdrianRoman 没有终止 NUL(至少,没有有意义的 NUL,std::string 添加的 NUL 纯粹用于遗留互操作)。其实字符串里面可以有很多NUL字符
-
这是真的,无关紧要。如果您进行如下访问,您仍然可以溢出缓冲区:
&message[0]。 lakeweb 给出了正确答案。我只是简单地查看了代码并注意到地址使用情况,这可能很危险。这里不是这种情况,问题出在其他地方。
标签: c++ boost boost-interprocess