3

Linux で mmap() を使用して、ストリームの入出力クラスを作成する必要があります。そのために、いくつかの整数をファイルに書き込み、保存し、再度読み込み、ファイルのデータを cout に書き込むテスト コードを作成しようとしました。そのテストコードが機能する場合、後でストリームを出し入れするのに問題はありません。

私が最初に始めたとき、セグメント障害が発生しました。何も起こらなかった場合は、少しグーグルで調べました。この本http://www.advancedlinuxprogramming.com/alp-folder/alp-ch05-ipc.pdfを見つけました.107ページあたりにいくつかの便利なコードがあります. そのコードをコピーして貼り付け、いくつかの小さな変更を加えて、次のコードを取得しました。

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);

しかし、「マーク」カウントの後にセグメントが満杯になります。

次に、「読み取り部分」を次のように置き換えます。

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;
}

これは、ファイルが空であることを示す実用的なコードです。結果を変更せずにマッピングに書き込む方法をいくつか試しました。

では、どうすれば自分のコードを書くことができるのでしょうか? また、私の mmap 読み取りコードは問題ないように見えますか (明らかな欠陥が見られる場合に備えて)。

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

4

2 に答える 2

4

mmapの結果をテストする必要があります。表示される場合は、errnoMAP_FAILEDをチェックして理由を調べてください。

そして、 sysconf(_SC_PAGESIZE)で指定された複数のページ (多くの場合、それぞれ 4K バイト) を mmap したほうがよいでしょう。

statを使用して、特定のファイルのサイズ (およびその他の多くの数値) を調べることができます。

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

などについてはこちらもご覧ください。/proc/

于 2012-02-13T18:57:44.100 に答える
1

呼び出しscanf()はである必要がsscanf()あり、2番目のopenはファイル名"mapTester"の代わりに使用する必要があります。argv[1]これらのバグを修正すると、投稿されたプログラムは機能します(印刷してファイル22に残し44ます)。

于 2012-02-14T05:23:11.013 に答える