Open Source Web Development Tutorials - Dev Shed
LinuxのMMAPシステムコール
(2009/03/17公開)
相関信号
マッピングされる領域には、以下の2つの信号が相関しています。
SIGBUS
この信号は、すでに無効となったマッピング領域へアクセスが試みられたときに生成されます。例えば、ファイルがマッピングされた後に切り詰められた場合です。
SIGSEGV
この信号は、読み出し専用としてマッピングされた領域へ書き込みが試みられたときに生成されます。
munmap()
Linuxには、mmap()で作成したマッピングを削除するためのシステムコールとして、munmap()があります。
#include <sys/mman.h>
int munmap (void *addr, size_t len);
munmap()のコールは、任意のプロセスのアドレス空間に存在するページを含む任意のマッピングを削除します。このマッピングはaddr から始まり、ページ境界に合って、lenバイトの長さにわたって継続しています。マッピングが削除されたら、前に関連付いていたメモリは無効となり、その後アクセスを試みるとSIGSEGV信号が生成されます。
通常、munmap()には、前回に呼び出したmmap()からの戻り値とlenパラメータが渡されます。
成功すると、munmap()はゼロを戻します。失敗すると-1を戻し、適切なerrnoを示します。標準のerrno 値はEINVALしかありません。EINVALは、1つあるいは複数のパラメータが無効であったことを意味します。
一例を挙げましょう。以下のスニペットは、 [addr,addr+len]区間に存在するページを含むすべてのメモリ領域のマッピング削除(アンマッピング)を実行します。
if (munmap (addr, len) == -1)
perror ("munmap");
解説は、次のパートに続きます。
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








