OSDN Git Service

(split) Convert release and draft pages to UTF-8.
[linuxjm/LDP_man-pages.git] / release / man2 / mmap.2
1 .\" Hey Emacs! This file is -*- nroff -*- source.
2 .\"
3 .\" Copyright (C) 1996 Andries Brouwer <aeb@cwi.nl>
4 .\" and Copyright (C) 2006, 2007 Michael Kerrisk <mtk.manpages@gmail.com>
5 .\"
6 .\" Permission is granted to make and distribute verbatim copies of this
7 .\" manual provided the copyright notice and this permission notice are
8 .\" preserved on all copies.
9 .\"
10 .\" Permission is granted to copy and distribute modified versions of this
11 .\" manual under the conditions for verbatim copying, provided that the
12 .\" entire resulting derived work is distributed under the terms of a
13 .\" permission notice identical to this one.
14 .\"
15 .\" Since the Linux kernel and libraries are constantly changing, this
16 .\" manual page may be incorrect or out-of-date.  The author(s) assume no
17 .\" responsibility for errors or omissions, or for damages resulting from
18 .\" the use of the information contained herein.  The author(s) may not
19 .\" have taken the same level of care in the production of this manual,
20 .\" which is licensed free of charge, as they might when working
21 .\" professionally.
22 .\"
23 .\" Formatted or processed versions of this manual, if unaccompanied by
24 .\" the source, must acknowledge the copyright and authors of this work.
25 .\"
26 .\" Modified 1997-01-31 by Eric S. Raymond <esr@thyrsus.com>
27 .\" Modified 2000-03-25 by Jim Van Zandt <jrv@vanzandt.mv.com>
28 .\" Modified 2001-10-04 by John Levon <moz@compsoc.man.ac.uk>
29 .\" Modified 2003-02-02 by Andi Kleen <ak@muc.de>
30 .\" Modified 2003-05-21 by Michael Kerrisk <mtk.manpages@gmail.com>
31 .\"     MAP_LOCKED works from 2.5.37
32 .\" Modified 2004-06-17 by Michael Kerrisk <mtk.manpages@gmail.com>
33 .\" Modified 2004-09-11 by aeb
34 .\" Modified 2004-12-08, from Eric Estievenart <eric.estievenart@free.fr>
35 .\" Modified 2004-12-08, mtk, formatting tidy-ups
36 .\" Modified 2006-12-04, mtk, various parts rewritten
37 .\" 2007-07-10, mtk, Added an example program.
38 .\" 2008-11-18, mtk, document MAP_STACK
39 .\"
40 .\" Japanese Version Copyright (c) 1997-2000 SUTO, Mitsuaki and NAKANO Takeo
41 .\"         all rights reserved.
42 .\" Translated 1997-06-26, SUTO, Mitsuaki <suto@av.crl.sony.co.jp>
43 .\" Updated & Modified 1999-03-01, NAKANO Takeo <nakano@apm.seikei.ac.jp>
44 .\" Updated 2000-10-12, Nakano Takeo
45 .\" Updated 2001-08-16, Nakano Takeo
46 .\" Updated 2001-11-11, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
47 .\" Updated 2002-08-13, Akihiro MOTOKI
48 .\" Updated 2003-07- 2, Akihiro MOTOKI
49 .\" Updated 2003-09-14, Akihiro MOTOKI
50 .\" Updated & Modified 2004-12-28, Yuichi SATO <ysato444@yahoo.co.jp>
51 .\" Updated 2005-09-06, Akihiro MOTOKI
52 .\" Updated 2005-10-05, Akihiro MOTOKI
53 .\" Updated 2006-07-23, Akihiro MOTOKI, LDP v2.36
54 .\" Updated 2007-01-07, Akihiro MOTOKI, LDP v2.43
55 .\" Updated 2007-05-04, Akihiro MOTOKI, LDP v2.46
56 .\" Updated 2007-09-03, Akihiro MOTOKI, LDP v2.64
57 .\" Updated 2008-08-05, Akihiro MOTOKI, LDP v3.05
58 .\" Updated 2008-09-02, Akihiro MOTOKI, LDP v3.08
59 .\" Updated 2008-12-24, Akihiro MOTOKI, LDP v3.15
60 .\" Updated 2010-04-18, Akihiro MOTOKI, LDP v3.24
61 .\"
62 .\"WORD         file descriptor         ファイル記述子
63 .\"
64 .TH MMAP 2 2009-09-26 "Linux" "Linux Programmer's Manual"
65 .SH 名前
66 mmap, munmap \- ファイルやデバイスをメモリにマップ/アンマップする
67 .SH 書式
68 .nf
69 .B #include <sys/mman.h>
70 .sp
71 .BI "void *mmap(void *" addr ", size_t " length \
72 ", int " prot ", int " flags ,
73 .BI "           int " fd ", off_t " offset );
74 .BI "int munmap(void *" addr ", size_t " length );
75 .fi
76 .SH 説明
77 .BR mmap ()
78 は、新しいマッピングを呼び出し元プロセスの仮想アドレス空間に作成する。
79 新しいマッピングの開始アドレスは
80 .I addr
81 で指定される。マッピングの長さは
82 .I length
83 引き数で指定される。
84
85 .I addr
86 が NULL の場合、カーネルがマッピングを作成するアドレスを選択する。
87 この方法は最も移植性のある新しいマッピングの作成方法である。
88 .I addr
89 が NULL でない場合、カーネルはマッピングをどこに配置するかのヒントとして
90 .I addr
91 を使用する。Linux では、マッピングはすぐ近くのページ境界に作成される。
92 .\" Linux 2.6.24 より前では、アドレスは (アドレスが大きくなる方向で)
93 .\" すぐ次のページ境界に切り上げられていた。
94 .\" Linux 2.6.24 以降では、切り下げられる!
95 新しいマッピングのアドレスは、呼び出しの返り値として返される。
96
97 ファイルマッピングの内容は、
98 ファイルディスクリプタ
99 .I fd
100 で参照されるファイル (もしくは他のオブジェクト) のオフセット
101 .I offset
102 から開始される
103 .I length
104 バイトのデータで初期化される
105 (ファイルマッピングは無名マッピングの反対語である。
106 .B MAP_ANONYMOUS
107 を参照)。
108 .I offset
109
110 .I sysconf(_SC_PAGE_SIZE)
111 が返すページサイズの倍数でなければならない。
112 .LP
113 引き数
114 .I prot
115 には、マッピングのメモリ保護をどのように行なうかを指定する
116 (ファイルのオープンモードと矛盾してはいけない)。
117 .I prot
118 には、
119 .B PROT_NONE
120 か、以下のフラグをひとつ以上ビット毎の論理和 (OR) をとったものを
121 指定できる。
122 .TP 1.1i
123 .B PROT_EXEC
124 ページは実行可能である。
125 .TP
126 .B PROT_READ
127 ページは読み込み可能である。
128 .TP
129 .B PROT_WRITE
130 ページに書き込み可能である。
131 .TP
132 .B PROT_NONE
133 ページにはアクセスできない。
134 .LP
135 .I flags
136 引き数により、マッピングに対する更新が同じ領域をマッピングしている
137 他のプロセスに見えるか、更新がマッピング元のファイルを通じて
138 伝えられるか、が決定される。この動作は、以下の値のいずれか一つだけ
139 (複数は指定できない) を
140 .I flags
141 に含めることで指定する。
142 .TP 1.1i
143 .B MAP_SHARED
144 このマッピングを共有する。
145 マッピングに対する更新はこのファイルをマッピングしている他のプロセス
146 から見える。更新はマッピング元のファイルを通じて伝えられる。
147 ただし、ファイルの実際の更新は
148 .BR msync (2)
149 または
150 .BR munmap ()
151 が呼ばれるまで行われないこともある。
152 .TP
153 .B MAP_PRIVATE
154 プライベートな copy-on-write (書き込み時コピー) マップを生成する。
155 マッピングに対する更新は同じファイルをマッピングしている他のプロセス
156 には見えず、更新がマッピング元のファイルを通じて伝えられることもない。
157 .BR mmap ()
158 の呼び出し後にマッピング元のファイルに対して行われた変更が、
159 マップ領域に反映されるかどうかは規定されていない。
160 .LP
161 上記の二つのフラグは POSIX.1-2001 で規定されている。
162
163 さらに、以下の値のうち 0 個以上をビット毎の論理和 (OR) で
164 .I flags
165 に指定することができる。
166 .TP
167 .BR MAP_32BIT " (Linux 2.4.20, 2.6 以降)"
168 マッピングをプロセスのアドレス空間の先頭 2 ギガバイト以内に配置する。
169 このフラグがサポートされているのは x86-64 アーキテクチャ上の
170 64 ビットプログラムのみである。
171 このフラグが追加されたのは、スレッドのスタックをメモリの先頭 2GB 以内の
172 どこかに割り当てることで、初期のいくつかの 64 ビットプロセッサにおける
173 コンテキストスイッチの性能問題を改善するためである。
174 .\" See http://lwn.net/Articles/294642 "Tangled up in threads", 19 Aug 08
175 最近の x86-64 プロセッサではこの性能問題はもはや存在せず、
176 そのようなシステムではこのフラグを使用する必要はない。
177 .B MAP_FIXED
178 がセットされている場合は、
179 .B MAP_32BIT
180 フラグは無視される。
181 .TP
182 .B MAP_ANON
183 .B MAP_ANONYMOUS
184 の同義語。非推奨。
185 .TP
186 .B MAP_ANONYMOUS
187 マッピングはどのファイルとも関連付けされない。
188 マッピングの内容は 0 で初期化される。
189 引き数
190 .I fd
191
192 .I offset
193 は無視される。
194 ただし、実装によっては
195 .B MAP_ANONYMOUS
196 (もしくは
197 .BR MAP_ANON )
198 が指定された場合、
199 .I fd
200 を \-1 にする必要があり、
201 移植性が必要なアプリケーションでは必ず
202 .I fd
203 を \-1 にすべきである。
204 .B MAP_ANONYMOUS
205
206 .B MAP_SHARED
207 を組み合わせての利用は
208 カーネル 2.4 以降の Linux でのみサポートされている。
209 .TP
210 .B MAP_DENYWRITE
211 このフラグは無視される
212 .\" 1.1.36 で導入され、1.3.24 で削除された。
213 (ずっと前は、マップ元のファイルへの書き込みを行おうとすると、エラー
214 .B ETXTBUSY
215 で失敗するようにシグナルが設定されていたが、これは denial-of-service
216 (サービス拒否) 攻撃の原因となった)。
217 .TP
218 .B MAP_EXECUTABLE
219 このフラグは無視される。
220 .\" 1.1.38 で導入され、1.3.24 で削除された。
221 .\" proc_follow_link でテストされるフラグである。(ずっと前は、
222 .\" マップ元のファイルが実行可能であることを知らせるようになっていた。
223 .\" しかし、その情報は実際にはどこでも使われなかった。)
224 .\" Linus は MAP_EXECUTABLE に関連して DoS の話をしたが、
225 .\" MAP_DENYWRITE のことを考えていたのかな?
226 .TP
227 .B MAP_FILE
228 互換性のためのフラグ。無視される。
229 .\" On some systems, this was required as the opposite of
230 .\" MAP_ANONYMOUS -- mtk, 1 May 2007
231 .TP
232 .B MAP_FIXED
233 .I addr
234 をアドレスのヒントとして使用するのではなく、
235 .I addr
236 で指定されたアドレスをそのまま使用してマッピングを配置する。
237 .I addr
238 はページサイズの倍数でなければならない。
239 .I addr
240
241 .I len
242 で指定されたメモリ領域が既存のマッピングのページと重なる場合、
243 既存のマッピングの重なった部分は捨てられる。
244 もし指定されたアドレスが使用できない場合、
245 .BR mmap ()
246 は失敗する。
247 マッピングに対して固定アドレスを要求するのは移植性の面で劣るので、
248 このオプションは使用しないことを推奨する。
249 .TP
250 .B MAP_GROWSDOWN
251 スタック用に使用される。マッピングをメモリ内で逆向きに行うことを
252 カーネル仮想メモリシステムに指示する。
253 (訳注:マッピングは通常はメモリ・アドレスが増加する向きに行うが、
254 このオプションを指定すると逆向きにマッピングを行う)
255 .TP
256 .BR MAP_HUGETLB " (Linux 2.6.32 以降)"
257 "huge page" を使ってマッピングを割り当てる。
258 詳しい情報は、カーネル・ソースの
259 .I Documentation/vm/hugetlbpage.txt
260 を参照。
261 .TP
262 .BR MAP_LOCKED " (Linux 2.5.37 以降)"
263 マップされた領域のページを
264 .BR mlock (2)
265 の方法でメモリ内にロックする。
266 それ以前のカーネルでは、このフラグは無視される。
267 .\" このフラグがセットされていると、マッピングされたページはスワップアウト
268 .\" されない。
269 .TP
270 .BR MAP_NONBLOCK " (Linux 2.5.46 以降)"
271 .B MAP_POPULATE
272 と組み合わせた場合のみ意味を持つ。
273 read-ahead (前もって読み込むこと) を実行しない。
274 単に、すでに RAM 上に存在するページに対して
275 ページテーブルエントリを作成するだけである。
276 Linux 2.6.23 以降では、このフラグは
277 .B MAP_POPULATE
278 に何の影響も与えない。
279 いつか
280 .B MAP_POPULATE
281
282 .B MAP_NONBLOCK
283 を組み合わせた場合の動作は実装し直されるかもしれない。
284 .TP
285 .B MAP_NORESERVE
286 このマッピングに対するスワップ空間の予約を行わない。
287 スワップ空間を予約した場合は、このマッピングの変更が必ず可能なことが
288 保証される。予約を行わなかった場合、物理メモリに空きがないと
289 書き込み時に
290 .B SIGSEGV
291 エラーを受け取ることがある。
292 .BR proc (5)
293
294 .I /proc/sys/vm/overcommit_memory
295 ファイルについての議論も参照。
296 バージョン 2.6 より前のカーネルでは、このフラグは書き込み可能な
297 プライベート・マッピングについてのみ効果があった。
298 .TP
299 .BR MAP_POPULATE " (Linux 2.5.46 以降)"
300 マッピング用のページテーブルを配置 (populate) する
301 ファイルマッピングの場合には、これによりファイルが先読み (read-ahead)
302 が行われる。この以後は、マッピングに対するアクセスがページフォールトで
303 ブロックされることがなくなる。
304 .BR MAP_POPULATE
305 は Linux 2.6.23 以降でプライベート・マッピングについてのみ
306 サポートされている。
307 .LP
308 上記のフラグの中では、
309 .B MAP_FIXED
310 だけが POSIX.1-2001 で規定されている。
311 しかしながら、ほとんどのシステムで
312 .B MAP_ANONYMOUS
313 (またはその同義語である
314 .BR MAP_ANON )
315 もサポートされている。
316 .TP
317 .BR MAP_STACK " (Linux 2.6.27 以降)"
318 プロセスやスレッドのスタックに適したアドレスにマッピングを割り当てる。
319 現在のところ、このフラグは何もしないが、
320 glibc のスレッド実装では使用されている。
321 これは、いくつかのアーキテクチャではスタックの割り当てに関して特別な扱い
322 が必要な場合に、glibc にそのサポートを後で透過的に実装できるようにする
323 ためである。
324 .\" See http://lwn.net/Articles/294642 "Tangled up in threads", 19 Aug 08
325 .\" commit cd98a04a59e2f94fa64d5bf1e26498d27427d5e7
326 .\" http://thread.gmane.org/gmane.linux.kernel/720412
327 .\" "pthread_create() slow for many threads; also time to revisit 64b
328 .\"  context switch optimization?"
329 .LP
330 いくつかのシステムでは、上記以外にフラグとして
331 .BR MAP_AUTOGROW ,
332 .BR MAP_AUTORESRV ,
333 .BR MAP_COPY ,
334 .B MAP_LOCAL
335 が規定されている。
336 .LP
337 .BR mmap ()
338 によってマップされたメモリの属性は
339 .BR fork (2)
340 の際に継承される。
341 .LP
342 ファイルはページサイズの整数倍の領域にマップされる。サイズがページサイズの
343 整数倍でないファイルの場合、マップ時に残りの領域は 0 で埋められ、この領域へ
344 書きこみを行ってもファイルに書き出されることはない。マッピングを行った元
345 ファイルのサイズを変更した場合、元ファイルの追加されたり削除された領域に対応
346 するマップされたページに対してどのような影響があるかは規定されていない。
347 .SS munmap()
348 システムコール
349 .BR munmap ()
350 は指定されたアドレス範囲のマップを消去し、
351 これ以降のその範囲内へのメモリ参照は不正となる。
352 この領域は、プロセスが終了したときにも自動的にアンマップされる。
353 一方、ファイル記述子をクローズしても、この領域はアンマップされない。
354 .LP
355 .I addr
356 アドレスはページサイズの整数倍でなければならない。指定された範囲の一部分を
357 含む全てのページはアンマップされ、これ以降にこれらのページへの参照があると
358 .B SIGSEGV
359 が発生する。
360 指定した範囲内にマップされたページが一つも含まれていない場合でも
361 エラーにならない。
362 .SS ファイルと関連付けられたマッピングに対するタイムスタンプの更新
363 ファイルと関連付けられたマッピングの場合、マッピングされたファイルの
364 .I st_atime
365 フィールドは、
366 .BR mmap ()
367 されてからアンマップ (unmap) されるまでの間に更新されることがある。
368 それまでに更新が行われていなければ、マップされたページへの最初の参照があった
369 際に更新される。
370 .LP
371 .B PROT_WRITE
372
373 .B MAP_SHARED
374 の両方を指定してマップされたファイルの場合、書き込みがあると、
375 .I st_ctime
376
377 .I st_mtime
378 の両フィールドは、マップされた領域への書き込みより後で、
379 .B MS_SYNC
380 または
381 .B MS_ASYNC
382 フラグを指定して
383 .BR msync (2)
384 が呼ばれる前までに更新される。
385 .SH 返り値
386 .BR mmap ()
387 は成功するとマップされた領域へのポインタを返す。
388 失敗すると値
389 .B MAP_FAILED
390 (つまり
391 .IR "(void\ *)\ \-1" )
392 を返し、
393 .I errno
394 がエラーの内容にしたがってセットされる。
395 .BR munmap ()
396 は成功すると 0 を返す。失敗すると \-1 を返し、
397 .I errno
398 がセットされる (多くの場合
399 .B EINVAL
400 になるだろう)。
401 .SH エラー
402 .TP
403 .B EACCES
404 以下のいずれかの場合。
405 ファイル記述子の参照先が通常のファイルではない (non-regular file) 。
406 .B MAP_PRIVATE
407 を要求したが
408 .I fd
409 は読み込み用にオープンされていない。
410 .B MAP_SHARED
411 を要求して
412 .B PROT_WRITE
413 をセットしたが
414 .I fd
415 は読み書きモード
416 .RB ( O_RDWR )
417 でオープンされていない、
418 .B PROT_WRITE
419 をセットしたが、ファイルは追加 (append) 専用である。
420 .TP
421 .B EAGAIN
422 ファイルがロックされている。またはロックされているメモリが多すぎる
423 .RB ( setrlimit (2)
424 を参照)。
425 .TP
426 .B EBADF
427 .I fd
428 が有効なファイル記述子 (file descriptor) ではない
429 (かつ
430 .B MAP_ANONYMOUS
431 がセットされていない)。
432 .TP
433 .B EINVAL
434 .I addr
435
436 .I length
437
438 .I offset
439 が適切でない
440 (例えば、大きすぎるとか、ページ境界にアラインメントされていない)。
441 .TP
442 .B EINVAL
443 (Linux 2.6.12 以降)
444 .I length
445 が 0 であった。
446 .TP
447 .B EINVAL
448 .I flags
449
450 .B MAP_PRIVATE
451
452 .B MAP_SHARED
453 のどちらも含まれていなかった、もしくは
454 その両方が含まれていた。
455 .TP
456 .B ENFILE
457 .\" これは共有匿名 (anonymous) セグメントのためのものである。
458 .\" [2.6.7] shmem_zero_setup()-->shmem_file_setup()-->get_empty_filp()
459 オープンされたファイルの総数がシステムの制限に達した。
460 .\" .TP
461 .\" .B ENOEXEC
462 .\" ファイルを読み込み用にマップできなかった。
463 .TP
464 .B ENODEV
465 指定されたファイルが置かれているファイルシステムがメモリマッピングをサポート
466 していない。
467 .TP
468 .B ENOMEM
469 メモリに空きがない、または処理中のプロセスのマッピング数が最大数を超過した。
470 .TP
471 .B EPERM
472 .I prot
473 引き数は
474 .B PROT_EXEC
475 を行うように指定されているが、
476 no-exec でマウントされたファイルシステム上のファイルに
477 マップ領域が対応している。
478 .\" (2.4.25 / 2.6.0 以降)
479 .TP
480 .B ETXTBSY
481 .B MAP_DENYWRITE
482 がセットされているが
483 .I fd
484 で指定されているオブジェクトは書き込み用に開かれている。
485 .LP
486 マップ領域を利用する際に、以下のシグナルが発生することがある:
487 .TP
488 .B SIGSEGV
489 読み込み専用で mmap された領域へ書き込みを行おうとした。
490 .TP
491 .B SIGBUS
492 バッファのうち、ファイルに関連づけられていない部分
493 (例えばファイル末尾を越えた部分など。これには
494 他のプロセスがファイルを切り詰めた場合なども含まれる)
495 にアクセスしようとした。
496 .SH 準拠
497 SVr4, 4.4BSD, POSIX.1-2001.
498 .\" SVr4 にはさらに ENXIO と ENODEV のエラーコードについての記述がある。
499 .\" SUSv2 にはさらに EMFILE と EOVERFLOW のエラーコードについての記述がある。
500 .SH 可用性
501 .BR mmap (),
502 .BR msync (2)
503 .BR munmap ()
504 が利用可能な POSIX システムでは、
505 .B _POSIX_MAPPED_FILES
506 は <unistd.h> で 0 より大きな値に定義される
507 .RB ( sysconf (3)
508 も参照のこと)。
509 .\" POSIX.1-2001: _POSIX_MAPPED_FILES は -1 か 0 か 200112L の
510 .\" いずれかに定義されることになっている。
511 .\" -1: 利用不可、0: sysconf() に問いあわせる
512 .\" glibc では POSIX_MAPPED_FILES は 1 に定義されている。
513 .SH 注意
514 カーネル 2.4 以降、このシステムコールは
515 .BR mmap2 (2)
516 に取って代わられた。
517 現在では、
518 .\" プラットフォームにより異なるが、 glibc 2.1/2.2 あたりから。
519 glibc の
520 .BR mmap ()
521 のラッパー関数は
522 .I offset
523 を適切に調整してから
524 .BR mmap2 (2)
525 を起動する。
526
527 (i386 などの) いくつかのアーキテクチャでは、
528 .B PROT_WRITE
529 をセットすると、暗黙のうちに
530 .B PROT_READ
531 がセットされる。
532 .B PROT_READ
533 をセットした際に暗黙のうちに
534 .B PROT_EXEC
535 がセットされるかどうかは、アーキテクチャ依存である。
536 移植性を考慮したプログラムでは、
537 新規にマップした領域でコードを実行したい場合は、常に
538 .B PROT_EXEC
539 をセットすべきである。
540
541 マッピングを作成する移植性のある方法は、
542 .I addr
543 に 0 (NULL) を指定し、
544 .I flags
545 から
546 .B MAP_FIXED
547 を外すことである。
548 この場合、システムがマッピング用のアドレスの選択を行う。
549 アドレスは既存のマッピングと衝突しないように、
550 かつ 0 にならないように選択される。
551 .B MAP_FIXED
552 フラグが指定され、かつ
553 .I addr
554 が 0 (NULL)
555 の場合には、マップされるアドレスが 0 (NULL) になる。
556 .SH バグ
557 Linux においては、上記の
558 .B MAP_NORESERVE
559 で述べられているような保証はない。
560 デフォルトでは、システムがメモリを使い切った場合には、
561 どのプロセスがいつ強制終了されるか分からないからである。
562
563 2.6.7 より前のカーネルでは、
564 .I prot
565
566 .B PROT_NONE
567 が指定された場合にのみ、
568 .B MAP_POPULATE
569 フラグが効力を持つ。
570
571 SUSv3 では、
572 .I length
573 が 0 の場合、
574 .BR mmap ()
575 は失敗すると規定されている。しかしながら、2.6.12 より前のカーネルでは、
576 この場合に
577 .BR mmap ()
578 は成功していた (マッピングは作成されず、
579 .I addr
580 が返されていた)。
581 カーネル 2.6.12 以降では、
582 .BR mmap ()
583 はエラー
584 .B EINVAL
585 で失敗する。
586 .SH 例
587 .\" FIXME . Add an example here that uses an anonymous shared region for
588 .\" IPC between parent and child.
589 .PP
590 以下のプログラムは、一番目のコマンドライン引き数で指定された
591 ファイルの一部を標準出力に表示する。
592 表示する範囲は、二番目、三番目のコマンドライン引き数で渡される
593 オフセットと長さで指定される。
594 このプログラムは、指定されたファイルの必要なページのメモリ・
595 マッピングを作成し、
596 .BR write (2)
597 を使って所望のバイトを出力する。
598 .nf
599
600 #include <sys/mman.h>
601 #include <sys/stat.h>
602 #include <fcntl.h>
603 #include <stdio.h>
604 #include <stdlib.h>
605 #include <unistd.h>
606
607 #define handle_error(msg) \\
608     do { perror(msg); exit(EXIT_FAILURE); } while (0)
609
610 int
611 main(int argc, char *argv[])
612 {
613     char *addr;
614     int fd;
615     struct stat sb;
616     off_t offset, pa_offset;
617     size_t length;
618     ssize_t s;
619
620     if (argc < 3 || argc > 4) {
621         fprintf(stderr, "%s file offset [length]\\n", argv[0]);
622         exit(EXIT_FAILURE);
623     }
624
625     fd = open(argv[1], O_RDONLY);
626     if (fd == \-1)
627         handle_error("open");
628
629     if (fstat(fd, &sb) == \-1)           /* To obtain file size */
630         handle_error("fstat");
631
632     offset = atoi(argv[2]);
633     pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) \- 1);
634         /* offset for mmap() must be page aligned */
635
636     if (offset >= sb.st_size) {
637         fprintf(stderr, "offset is past end of file\\n");
638         exit(EXIT_FAILURE);
639     }
640
641     if (argc == 4) {
642         length = atoi(argv[3]);
643         if (offset + length > sb.st_size)
644             length = sb.st_size \- offset;
645                 /* Can\(aqt display bytes past end of file */
646
647     } else {    /* No length arg ==> display to end of file */
648         length = sb.st_size \- offset;
649     }
650
651     addr = mmap(NULL, length + offset \- pa_offset, PROT_READ,
652                 MAP_PRIVATE, fd, pa_offset);
653     if (addr == MAP_FAILED)
654         handle_error("mmap");
655
656     s = write(STDOUT_FILENO, addr + offset \- pa_offset, length);
657     if (s != length) {
658         if (s == \-1)
659             handle_error("write");
660
661         fprintf(stderr, "partial write");
662         exit(EXIT_FAILURE);
663     }
664
665     exit(EXIT_SUCCESS);
666 } /* main */
667 .fi
668 \"O .SH "SEE ALSO"
669 .SH 関連項目
670 .BR getpagesize (2),
671 .BR mincore (2),
672 .BR mlock (2),
673 .BR mmap2 (2),
674 .BR mprotect (2),
675 .BR mremap (2),
676 .BR msync (2),
677 .BR remap_file_pages (2),
678 .BR setrlimit (2),
679 .BR shmat (2),
680 .BR shm_open (3),
681 .BR shm_overview (7)
682 .br
683 B.O. Gallmeister, POSIX.4, O'Reilly, pp. 128-129 and 389-391.
684 .\"
685 .\" 私の後について言ってみて: プライベートな読み込み専用のマッピングは
686 .\" 共有された読み込み専用のマッピングと 100% 等しい。
687 .\" 「もし」も「しかし」も「たぶん」もない。-- Linus