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つのリンクしか投稿できません。
助けていただきありがとうございます。書いたファイルが書き込み保護されている場所に書いてあり、そのすべてが失敗したことがわかりました。 – RobbingDaHood