Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
strcpy到mmap地址retuns总线错误_C_Linux_Memory - Fatal编程技术网

strcpy到mmap地址retuns总线错误

strcpy到mmap地址retuns总线错误,c,linux,memory,C,Linux,Memory,我创建了一个进程,该进程使用MAP_SHARED flag set调用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(

我创建了一个进程,该进程使用MAP_SHARED flag set调用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是mmap length参数中指定的4个字节,您将5*sizeofint放在下面的行中:

map_addr = mmap(NULL, 5*sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
如果文件大小小于20字节,则可以使用fallocate调用预分配内存


如果SydDyFiel.txt文件大小是为了帮助人们帮助你,你可能想考虑创建一个。你可以发布整个代码吗?我还没见到你。在发布的代码中。您如何声明map_addr?在mmap中,长度为5*sizeofint。如果复制任何大于20字节的字符串,则会导致问题。此外,您是否尝试使用memcpy而不是strcpy来复制字符串?shared_file.txt的大小是多少?如果它小于20字节,它也会导致总线错误Hi askmish,您是正确的shared_file.txt的大小小于20字节,这就是问题所在。谢谢