2017-10-11 63 views
0
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为什么我得到这个分段错误?

+7

您可以检查mmap()是否失败。如果是这样,请调用'perror()'或以其他方式检查'errno'以了解为什么失败。您还需要检查open()是否失败。 – nos

+0

你的文件“integer”可能不存在;你必须首先创建一个合适的长度,一个零长度的文件不会这样做......如果你用'O_CREAT'打开它,在mmapping(seek()()之前写一些(足够你的数据)也会做)。 – Ctx

回答

2

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

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

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