2017-10-11 3 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; 
} 

これは、あなたがopenmmapからのエラーをチェックする必要がありセグメンテーションフォールト11になぜこのセグメンテーションフォルトが発生しますか?

+7

mmap()が失敗したかどうかを確認できます。それがあった場合は、 'perror()'を呼び出すか、 'errno'を調べて失敗した理由を調べます。また、open()が失敗したかどうかを確認する必要があります。 – nos

+0

あなたのファイル「整数」はおそらく存在しません。あなたは適切な長さで最初にそれを作成しなければなりません、長さが0のファイルはしません...もしあなたが 'O_CREAT'でそれを開くなら、mmapping(seek())する前にやります)。 – Ctx

答えて

2

を返します。また、警告でコンパイルし、必要なインクルードファイルをインクルードします。 mmapは、多くのシステムで正しいプロトタイプが必要です。その理由は、off_t引数のために最後の引数として0を渡したときに壊れる可能性があるからです。

しかし、それは十分ではありません。ファイルが存在し、ゼロ以外のサイズですか? mmapは、ファイルの終わりを超えてページをうまくマッピングできますが、それらのページにアクセスするとエラーが発生します。実際にデータをファイルに書きたい場合は、それが十分な長さであることを確認する必要があります。それにはftruncateを使用してください。

mmapの最初の引数としてcaddr_tが記載されていれば、どの博物館でドキュメントを見つけたのだろうかと思っていますが、その点も参考になります。

関連する問題