Top > C言語 > mmap


関数仕様

機能
  • 新しいマッピングを、呼び出し元プロセスの仮想アドレス空間に作成する
  • 新しいマッピングの開始アドレスは 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); /* 無限に 0 が埋められているデバイス */
  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 ");
 
  /* buf を使用する */
 
  munmap (buf, BUF_MAX_LEN);
  return 0;
}


履歴

日付内容
2014/06/06引数及びサンプル内で、prot と記載すべきところが port となっておりました。ご指摘ありがとうございました。

リロード   凍結解除 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Fri, 06 Jun 2014 23:36:18 JST (1505d)