繁体   English   中英

strcpy到mmap地址重新调整总线错误

[英]strcpy to mmap address retuns bus error

我创建了一个使用MAP_SHARED标志集调用mmap的进程,当我尝试将字符串复制到该地址时,我收到转储的Bus error core,请有人解释一下其原因以及如何解决。 以下是我的代码

    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的倍数或与数据类型大小相关的垃圾数据访问。

首先,您应该检查在以下行中的mmap() length参数(在其中放置5*(sizeof(int)) )中指定的shared_file.txt文件大小是否> = 20字节(假设sizeof int为4字节) :

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

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

如果shared_file.txt文件大小小于shared_file.txt 20字节,然后您要求mmap映射20字节,则超出实际编号时,它可能会导致总线错误。 文件中可用字节数的上限,因为这将access to an undefined portion of a memory 在这种情况下,在内存初始化期间将不返回MMAP_FAILED。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM