我创建了一个调用mmap并设置了MAP_SHARED标志的进程,当我尝试将字符串复制到该地址时,我收到了Bus错误核心转储,有人可以解释其背后的原因以及如何修复它。以下是我的代码
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);
}
答案 0 :(得分:2)
总线错误的原因通常是尝试取消引用尚未正确初始化的指针,并且包含无法以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
调用来预分配内存。
如果shared_file.txt
文件大小是< = 20字节然后你要求mmap映射20个字节,那么当你写入超出实际数量时,它可能会导致总线错误。文件中可用的字节数,因为它是access to an undefined portion of a memory
。在内存初始化期间,在这种情况下不会返回MMAP_FAILED。
快速检查是否可以在mmap char*
指针中编写单个字符。如果你不能(你会得到一个SIGBUS),那意味着文件大小为零。