将共享内存地址值打印到命令行
print shared memory address value to command line
我正在尝试使用 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?)但我真的不明白这里的内部工作原理。任何帮助表示赞赏!
控制台显示内存中字节的 ASCII 表示。任何小于 13 的字符通常都是不可打印的。尝试将内存设置为 67 之类的值。
明确地将mem
转换为int
,然后std::cout
将输出该值作为数字,而不是与存储在[=10=中的ASCII码对应的字母](这可能无法打印或看起来很有趣,后者是你的情况)。
请参阅 cout not printing unsigned char 以获得关于该问题的更详尽的答案。
我正在尝试使用 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?)但我真的不明白这里的内部工作原理。任何帮助表示赞赏!
控制台显示内存中字节的 ASCII 表示。任何小于 13 的字符通常都是不可打印的。尝试将内存设置为 67 之类的值。
明确地将mem
转换为int
,然后std::cout
将输出该值作为数字,而不是与存储在[=10=中的ASCII码对应的字母](这可能无法打印或看起来很有趣,后者是你的情况)。
请参阅 cout not printing unsigned char 以获得关于该问题的更详尽的答案。