【问题标题】:Why am I getting this segmentation fault?为什么我会收到此分段错误?
【发布时间】:2017-10-11 08:45:28
【问题描述】:
int main() {
    int fd;     //  File Descriptor for the integer file
    int pagesize=getpagesize(); //  To store the size of virtual page

    printf("\nPage size is %d bytes.\n100 integers require %lu bytes\n",pagesize,100*sizeof(int));
    void *data; //  This is the pointer which will store the returned pointer when mmap() is called

    fd=open("integer", O_RDWR); 

    data=mmap((caddr_t)0, pagesize, PROT_WRITE | PROT_READ, MAP_SHARED, fd,0);
    close(fd);

    sprintf((char*)data,"%d",100);

    return 0;
}

这会返回分段错误 11

【问题讨论】:

  • 你可以检查 mmap() 是否失败。如果确实如此,请致电perror() 或以其他方式检查errno 以了解失败的原因。您还需要检查 open() 是否失败。
  • 您的文件“整数”可能不存在;你必须先用适当的长度创建它,一个零长度的文件不会做......如果你用O_CREAT打开它,在映射之前写一些(足够你的数据)字节到它(seek()ing也可以)。

标签: c segmentation-fault


【解决方案1】:

您应该检查来自openmmap 的错误。此外,编译时带有警告并包含必要的包含文件。 mmap 在许多系统上尤其需要正确的原型,因为它的 off_t 参数在您将 0 作为最后一个参数传递时可能会破坏事情。

但这还不够。文件是否存在并且大小非零? mmap 可以愉快地映射超出文件末尾的页面,但访问这些页面会导致错误。如果您确实想要将数据写入文件,则需要确保它足够长。为此使用ftruncate

另外,我想知道你在哪个博物馆找到了你的文档,如果它提到 caddr_t 作为 mmap 的第一个参数,但那不是重点,如果编译它也应该有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2016-01-01
    • 2021-10-19
    相关资源
    最近更新 更多