其他分享
首页 > 其他分享> > c-SIGBUS何时使用新的安置?

c-SIGBUS何时使用新的安置?

作者:互联网

我有以下代码(已更新):

#include <iostream>
#include <cassert>
#include <errno.h>
#include <string.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <new>

struct S {
uint32_t a;
uint32_t b;
};

int main() {
    const auto fd = open("/tmp/abc.txt", O_RDWR | O_CREAT, S_IRWXU);
    assert(fd > 0);
    void* ptr = mmap(nullptr, sizeof(S), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    assert(MAP_FAILED != ptr);
    std::cout << "address: " << ptr << std::endl;
    auto tptr = new (ptr) S();
    tptr->a = 99;
    const auto rc = msync(&ptr, sizeof(S), MS_ASYNC);
    std::cout << "msync returned " << rc << std::endl;
    if (rc != 0) {
        std::cout << "error code = " << errno << ": " << strerror(errno) << std::endl;
    }
}

当我在GDB中运行它时,我得到了:

address: 0x7ffff7ff8000

Program received signal SIGBUS, Bus error.
0x0000000000400adb in main () at msync.cpp:20
20      auto tptr = new (ptr) S();

我看到有人提到内存对齐问题,并检查了0x7ffff7ff8000是否可被2、8、16、32和64整除.然后,我很困惑它期望的对齐方式.还是其他?

提前致谢.

解决方法:

似乎您正在尝试在此处创建文件并将其写入,因此最初它的大小为零,并且占用的内存页面为零.但是mmap无法写完文件的末尾,从而有效地为您分配了内存:首先它怎么知道要向文件中添加多少字节?您需要确保/tmp/abc.txt包含一些字符,这些字符随后可以被新的展示位置覆盖.它不能追加.

在我将大约8个随机字节写入/tmp/abc.txt之后,运行程序成功并覆盖了

63 00 00 00 00 00 00 00

如我的x86-64上所预期.然后,程序报告您可能打算生成的msync错误,并正常退出.

标签:g,linux,c-4
来源: https://codeday.me/bug/20191025/1928155.html