开发者

mmap SIGSEGV when memory map is to a class member and modified outside the class

I have a very simple class that opens a file and creates a memory mapped file.

The region is mapped to the member variable called data_ which is defined as unsigned char* data_;

The memory map part looks like this:

// Create memory mapped file
unsigned char* data_ = (unsigned char*)mmap(NULL, 1024, 
                           PROT_READ | PROT_WRITE, MAP_SHARED, fd_, 0);

if (block_data_ == MAP_FAILED) {
    throw Exception(std::string("mmap: ") + strerror(errno));
}

Now I can read and write to the file by simply writing to the data_ variable (up to the size 1024.

But, the intention is not to do it this way. I have a function that returns me a pointer to data_.

When I simply create the block it works fine all the way up until I try to write to the data开发者_Go百科 OUTSIDE of the class. That's when I get a SIGSEGV.

How do I get around that?


I am not fully sure what you mean that you have done so far. In the code you posted, it appears as if you assign the return-value of mmap to a local variable data_ instead of the member-variable data_. Is this just the currently "working" version (that isn't intended to use the member-variable), or is it an error?

Are you sure you want to return a pointer to data_? Isn't it data_ itself that you want to return? Returning a pointer to data_ sounds like something you might do if you want to change what it points to, but if data_ already points to the mmapped area, doing that sounds wrong.

Using the mmapped memory outside of the class should be no different from using it inside the class, so it sounds to me like you might have done something wrong either when assigning or returning the member-variable data_.

In the code you posted, you also check block_data instead of data_ for error.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜