【问题标题】:get N-th byte from mmaped file从映射文件中获取第 N 个字节
【发布时间】:2015-07-13 22:34:18
【问题描述】:

我是 C 的新手,现在我正在学习 mmap。我想从 mmaped 文件中获取第 N 个字节,但是我得到了这个错误 Segmentation Fault (core dumped) 当我用 gdb 测试我的程序时,我发现这条线有问题 printf("%d\n", (int) data[sk]); 然后我 print data 我得到了

(gdb) print data[sk]
Cannot access memory at address 0xfe5f07d0
(gdb) print data
$1 = 0xfe5f0000 <Address 0xfe5f0000 out of bounds>

我不知道为什么会出现此错误。这是我的代码

int main( int argc, char * argv[] ){
    int sk;
    int d;
    char *data;
    size_t s;
    if(argc == 3){
        sk = atoi(argv[2]);
        d = da_open(argv[1]);
        s = da_fileSize(d);
        data = (char*)da_mmap(d, s);
        printf("File Size: %d\n", (int) s);
        printf("%d\n", (int) data[sk]); // this line is bad. But why?
        close(d);
    }
    return 0;
}

这也是我的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <string.h>

int da_open(const char *name);
void *da_mmap(int d, size_t size);
size_t da_fileSize();

int da_open(const char *name){
   int dskr;
   dskr = open( name, O_RDWR );
   if( dskr == -1 ){
      perror( name );
      exit(1);
   }
   printf( "dskr1 = %d\n", dskr );
   return dskr;
}

void *da_mmap(int d, size_t size){
     void *a = NULL;
     a = mmap(NULL, size, PROT_WRITE, MAP_SHARED, d, 0);
     if( a == MAP_FAILED ){
          perror( "mmap failed" );
          abort();
     }
     return a;
}

size_t da_fileSize(int d){
    struct stat info;
    if(fstat(d, &info) == -1) {
        perror("fstat failed");
        exit(1);
    }
    return (size_t)info.st_size;
}

int main( int argc, char * argv[] ){
    int sk;
    int d;
    char *data;
    size_t s;
    if(argc == 3){
        sk = atoi(argv[2]);
        d = da_open(argv[1]);
        s = da_fileSize(d);
        data = (char*)da_mmap(d, s);
        printf("File Size: %d\n", (int) s);
        printf("%d\n", (int) data[sk]);
        close(d);
    }
    return 0;
}

【问题讨论】:

    标签: c memory segmentation-fault mmap coredump


    【解决方案1】:

    我猜您的 mmap 中还需要读取权限:PROT_WRITE | PROT_READ

    【讨论】:

      【解决方案2】:

      分段错误是指您尝试访问不属于您的内存空间。 它通常发生在数组中(就像你的情况一样)。如果您有一个长度为 5 个元素的数组并尝试访问第 6 个元素,则会出现分段错误并且您的程序将停止。

      所以在printf("%d\n", (int) data[sk]);这行你的错误可能是sk中的值太大了,你应该尝试打印它来检查它。

      您也应该始终检查系统函数(不是您的函数)的返回,例如您的 open() 或 atoi()。如果打开失败并且您没有停止程序,那么您将度过一段糟糕的时光:)

      【讨论】:

        猜你喜欢
        • 2018-08-30
        • 2020-06-12
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 2013-02-21
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        相关资源
        最近更新 更多