2017-10-08 93 views
1

メモリに書き込もうとするとバスエラー(コアダンプ)が発生します。私はLinuxでmmap()とopen()関数を使ってバイナリファイルに書きたいと思っています。バイナリファイルに1から100までの整数を書きたいのですが、ファイルに直接書き込むのではなく、メモリにマッピングします。mmapによるバスエラー

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <sys/mman.h> 
#include <string.h> 
#include <stdlib.h> 
#define FILE_SIZE 0x100 

int main(int argc,char *argv[]) 
{ 

    int fd; 
    void *pmap; 

    printf("im here"); 
    //fd=open(argv[1],O_RDWR|O_CREAT,S_IRUSR|S_IWUSR); 
    fd=open("numbers.raw",O_RDWR); 

    if(fd == -1) 
    { 
     perror("open"); 
     exit(1); 
    } 

    lseek(fd,FILE_SIZE+1,SEEK_SET); //checking the file length 
    lseek(fd,0,SEEK_SET);//points to start of the file 

    //create the memory mapping 
    pmap = mmap(0,FILE_SIZE,PROT_WRITE,MAP_SHARED,fd,0); 



    if(pmap == MAP_FAILED) 
    { 
     perror("mmap") ; 
     close(fd); 
     exit(1); 
    } 

    close(fd); 

    for(int i=1;i<=100;i++) 
     sprintf(pmap,"%d",i); 

    return 0; 

} 

答えて

0

「ファイルの長さを確認していますが、その呼び出しの戻り値は決して確認していません。私はあなたのファイルが十分ではないので、それは失敗していると思いますので、後でバスエラーです。 複数の他の無関係のミスは仕方 により、同様にあなたのファイルにあります。

  1. あなたのファイルサイズが0x100のバイトがバイナリで100個の整数を格納するのに十分なされている前提としては。これは64ビットシステムでは当てはまりません。
  2. 実際にはバイナリ数値を格納しているわけではありません。数値の文字列を格納しています。
  3. あなたは書き込む場所が進んでいないので、ファイルの先頭に1つずつ数字を書きます。
+0

FILE_SIZEを0xA00に引き上げて、より安全な側にしました。バイナリの数値を格納し、進めるために、printf(pmap、 "%d \ n"、i)を使用しました。しかし、私はまだ同じエラーが発生します。 –

+0

また、open()コマンドでファイルサイズを指定するには –