我正在尝试使用boost的共享内存库来进行一些进程间通信(VS 2015)。我发现example online非常有帮助。为了理智,我只想执行一个简单的检查,即我写入共享内存地址的值是我想要的。为此,我想使用cout打印共享内存的值。这是我目前的代码:
#include <boost\interprocess\shared_memory_object.hpp>
#include <boost\interprocess\mapped_region.hpp>
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <cstring>
#include <cstdlib>
#include <string>
int main()
{
using namespace boost::interprocess;
struct shm_remove
{
shm_remove() { shared_memory_object::remove("MySharedMemory"); }
~shm_remove() { shared_memory_object::remove("MySharedMemory"); }
} remover;
//Create a shared memory object
shared_memory_object shm(create_only, "MySharedMemory", read_write);
//Set size to 1
shm.truncate(1);
//Map the whole shared memory in this process
mapped_region region(shm, read_write);
//Write all the memory to 1
std::memset(region.get_address(), 1, region.get_size());
//Check that memory was initialized to 1
char *mem = static_cast<char*>(region.get_address());
for (std::size_t i = 0; i < region.get_size(); ++i)
{
std::cout << "Memory value: " << *mem << "\n";
if (*mem++ != 1)
{
return 1; //Error checking memory
}
}
std::cout << "press any key to quit";
_getch();
}
代码工作正常,当它检查映射的内存已设置为1时,不会抛出任何错误。但是,当我尝试打印我认为应该是地址的值时,我得到一个笑脸......
有人能指出我正确的方向吗?我有一些怀疑(没有终止\ 0?)但我真的不明白这里的内部运作。任何帮助表示赞赏!
答案 0 :(得分:3)
明确地将mem
投射到int
,然后std::cout
将输出值作为数字,而不是与mem
中存储的ASCII代码对应的字母(这可能是不可打印的或看起来很有趣,后者就是你的情况。)
请参阅cout not printing unsigned char以获得有关此问题的更全面的答案。
答案 1 :(得分:2)
控制台显示内存中字节的ASCII表示形式。 13岁以下的任何角色通常都是不可打印的。尝试将内存设置为67。