|
リニューアル
サイトリニューアル中です。本ページは以下URLへ移動しました。
Prog.さな雑記
関数仕様
- 機能
- 新しいマッピングを、呼び出し元プロセスの仮想アドレス空間に作成する
- 新しいマッピングの開始アドレスは addr で指定される
- addr が NULL の場合、カーネルがマッピングを作成するアドレスを選択する
- addr が NULL でない場合、カーネルはマッピングをどこに配置するかのヒントとして addr を使用する
- ファイルマッピングの内容は、ファイルディスクリプタ fd で参照される
ファイルのオフセット offset から開始される len バイトのデータで初期化される
- offset は sysconf(_SC_PAGE_SIZE) が返すページサイズの倍数でなければならない
- 引数 prot には、マッピングのメモリ保護をどのように行なうかを指定する
- 書式
-
1
2
3
4
|
| #include <sys/mman.h>
void *mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset);
int munmap (void *addr, size_t len);
|
- 引数
addr :マップ/マップ解除するメモリの先頭アドレス
len :マップ/マップ解除するメモリの長さ(バイト単位)
prot :アクセス保護の指定
flags :フラグを指定
fd :マップするファイルのファイルディスクリプタ
offset:マップするファイルの先頭からのオフセット
- 戻り値
[mmap]
アドレス値:マップされたメモリの先頭アドレス
MAP_FAILED:エラーが発生 ((void *)-1)
[munmap]
0:メモリのマップ解除に成功
-1:エラーが発生
- PROT フラグ
PROT | 意味 |
---|
PROT_READ | メモリは読み出し可能 | PROT_WRITE | メモリは書き込み可能 | PROT_EXEC | メモリは実行可能 | PROT_NONE | メモリは全てのアクセスが不可能 |
- FLAG
FLAG | 意味 |
---|
MAP_PRIVATE | メモリに書き込んでも、ファイルには書き込まれない | MAP_SHARED | ファイルをマップしていれば、メモリに書き込むとファイルにも書き込まれる |
注意
- mmap() のエラー時、戻り値は MAP_FAILED (-1) である。NULL ではない。
サンプル
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
| #include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#define BUF_MAX_LEN 1024
int
main (void)
{
int fd;
char *buf = MAP_FAILED;
fd = open ("/dev/zero", O_RDONLY);
if (fd < 0)
perror ("open error ");
buf = mmap (0, BUF_MAX_LEN, (PROT_READ | PROT_WRITE), MAP_PRIVATE, fd, 0);
close (fd);
if (buf == MAP_FAILED)
perror ("mmap error ");
munmap (buf, BUF_MAX_LEN);
return 0;
}
|
履歴
日付 | 内容 |
---|
2014/06/06 | 引数及びサンプル内で、prot と記載すべきところが port となっておりました。ご指摘ありがとうございました。 |
|
|