2012-02-13 14 views
4

Linuxでmmap()を使用してストリームを入出力する必要があります。これを行うために、いくつかの整数をファイルに書き込んで保存し、再度読み込み、ファイル内のデータをcoutに書き込むテストコードを作成しようとしました。そのテストコードがうまくいけば、その後ストリームを出し入れすることは問題にならないでしょう。Linuxシステムでmmap()を読み書きする方法

私が最初に始めたとき、私はセグメントの欠陥を持っていました。私が何も起こらなかったら、ちょっと調べました。私はこの本http://www.advancedlinuxprogramming.com/alp-folder/alp-ch05-ipc.pdfを見つけました。どこに便利なコードがありますか?私は、そのコードを貼り付けると、いくつかの小さな変更を行ったと、このコードだコピー:

int fd; 
void* file_memory; 

/* Prepare a file large enough to hold an unsigned integer. */ 
fd = open ("mapTester", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); 

//Make the file big enough 
lseek (fd, 4 * 10 + 1, SEEK_SET); 
write (fd, "", 1); 
lseek (fd, 0, SEEK_SET); 

/* Create the memory mapping. */ 
file_memory = mmap (0, 4 * 10, PROT_WRITE, MAP_SHARED, fd, 0); 
close (fd); 

/* Write a random integer to memory-mapped area. */ 
sprintf((char*) file_memory, "%d\n", 22); 

/* Release the memory (unnecessary because the program exits). */ 
munmap (file_memory, 4 * 10); 

cout << "Mark" << endl; 

//Start the part where I read from the file 

int integer; 

/* Open the file. */ 
fd = open (argv[1], O_RDWR, S_IRUSR | S_IWUSR); 

/* Create the memory mapping. */ 
file_memory = mmap (0, 4 * 10, PROT_READ | PROT_WRITE, 
MAP_SHARED, fd, 0); 
close (fd); 

/* Read the integer, print it out, and double it. */ 
scanf ((char *) file_memory, "%d", &integer); 
printf ("value: %d\n", integer); 
sprintf ((char*) file_memory, "%d\n", 2 * integer); 

/* Release the memory (unnecessary because the program exits). */ 
munmap (file_memory, 4 * 10); 

をしかし、私は「マーク」coutの後にセグメントfultsを取得します。ファイルが空であることを私に示して、いくつかの作業コードがある

fd = open("mapTester", O_RDONLY); 

int* buffer = (int*) malloc (4*10); 

read(fd, buffer, 4 * 10); 

for(int i = 0; i < 1; i++) 
{ 
    cout << buffer[i] << endl; 
} 

は、その後、私はこれで「の部分を読んで」置き換えます。私は、結果に何の変更も加えずにマッピングに書き込む2つの方法を試しています。

私は自分のコードを書くことができますか? mmapのコードを読んでも問題がないようです(明らかな欠陥がある場合に備えて)。

私はまだ私を助けなかったいくつかの他のリソースを見つけましたが、私は新しいユーザーであるため、最大2つのリンクしか投稿できません。

答えて

4

mmapの結果をテストする必要があります。それがMAP_FAILEDを与えるならば、なぜerrnoを調べてください。

そして、あなたはより良いあなたがの大きさ(約他の多くの数の)いくつかの特定のファイルを見つけるためにstatを使用することができ、多くの場合、4Kバイトごとにページの倍数のmmap、およびsysconf(_SC_PAGESIZE)

によって与えられます。

既存のLinuxプログラムでstraceを使用して、自分が行っているシステムコールを知ることができます。

も参照してくださいthisについて/proc/など

+1

助けていただきありがとうございます。書いたファイルが書き込み保護されている場所に書いてあり、そのすべてが失敗したことがわかりました。 – RobbingDaHood

1

あなたscanf()呼び出しはsscanf()する必要があり、第二のオープンがファイル名として"mapTester"の代わりargv[1]を使用する必要があります。私がこれらのバグを修正すると、あなたの投稿されたプログラムが働きます(22を印刷し、44をファイルに残します)。

+0

あなたが言った変更に対応したコードを取得できませんでした。私はコメントの中でコードの書式を設定する方法を知らないので、メッセージの最後に置いてください。私はg ++コンパイラコマンドを使用しています、おそらく別のものを使用していますか? – RobbingDaHood

+0

これは長いので、コードを追加できません。私がここに書いたコードをコピーして2つの場所を変更し、コードの最後にセグメンテーションフォールトが付いてきました。しかし、2つの良い甘さのおかげで、非常に有用:) – RobbingDaHood

関連する問題