strcpy 到 mmap 地址返回总线错误

2024-04-01

我创建了一个进程,它调用设置了 MAP_SHARED 标志的 mmap,当我尝试将字符串复制到该地址时,我收到总线错误核心转储,有人可以解释一下其背后的原因以及如何修复它。以下是我的代码

    int main()
{
    int fd=0;
    char* ret = NULL;
    void *map_addr = NULL;

    fd = open("./shared_file.txt", O_RDWR, S_IRUSR | S_IWUSR);

    if(fd == -1) {
        printf("errno = %d\n",errno);
        printf("Aborting process1###########\n");
        abort();
    }

    map_addr = mmap(NULL, 5*sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

    if(map_addr == MAP_FAILED) {
        printf("mmap failed error no =%d\n",errno);
        close(fd);
        return -1;
    }

    printf("map_addr = %p#################\n",(int*)map_addr);
    printf("processid = %d#################\n",(int)getpid());

    ret = strcpy((char*)map_addr,"Stack Overflow");

    if(ret == (char*)map_addr)
        printf("strcpy success\n");

    /*if(msync(map_addr, sizeof(int), MS_SYNC))
        printf("msync failed errno = %d\n",errno);*/

   close(fd);

   sleep(120);

   return (0);
}

总线错误的原因通常是尝试取消引用尚未正确初始化的指针,并且包含无法以 4 或 1 的倍数访问或与数据类型大小相关的垃圾数据。

首先您应该检查是否shared_file.txt文件大小 >= 20 字节(假设 sizeof int 为 4 字节),如mmap()长度参数(你把5*(sizeof(int)))在下面一行中:

map_addr = mmap(NULL, 5*sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

如果文件大小小于 20 字节,您可以使用fallocate调用预分配内存。

If shared_file.txt文件大小 access to an undefined portion of a memory。在这种情况下,在内存初始化期间不会返回 MMAP_FAILED。

快速检查是看看是否可以在 mmap 中写入单个字符char*指针。如果不能(您将得到 SIGBUS),则意味着文件大小为零。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

strcpy 到 mmap 地址返回总线错误 的相关文章