2017-10-11 70 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的第一個參數,但那不是重點,如果編譯它也應該工作。