brk.2 rev 1.13.2.8

This commit is contained in:
Kazuo Horikawa 2001-09-08 05:52:22 +00:00
parent 872e454400
commit 707a753ed7
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=10626

View file

@ -30,10 +30,10 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)brk.2 8.4 (Berkeley) 5/1/95
.\" %FreeBSD: src/lib/libc/sys/brk.2,v 1.13.2.7 2001/08/31 10:15:15 ru Exp %
.\" %FreeBSD: src/lib/libc/sys/brk.2,v 1.13.2.8 2001/09/07 07:59:13 yar Exp %
.\"
.\" $FreeBSD: doc/ja_JP.eucJP/man/man2/brk.2,v 1.6 2001/08/19 07:14:26 horikawa Exp $
.Dd May 1, 1995
.\" $FreeBSD: doc/ja_JP.eucJP/man/man2/brk.2,v 1.7 2001/09/02 00:05:25 horikawa Exp $
.Dd July 12, 1999
.Dt BRK 2
.Os
.Sh 名称
@ -50,81 +50,120 @@
.Fn sbrk "int incr"
.Sh 解説
.Bf -symbolic
brk 関数と sbrk 関数は、仮想メモリ管理の到来の前の初期の日々から残された
歴史的に興味あるものです。
.Ef
.Fn brk
関数は、プロセスのデータセグメント (初期化されていないデータ) のブレーク
または最下位アドレスを
.Fa addr
(bss の真上) に設定します。データアドレス指定は、
.Fa addr
とスタックセグメントへの最も低いスタックポインタの間に制約されます。
メモリはページサイズ単位で
.Fa brk
によって割当てされます。
.Fa addr
は、システムページサイズ上に均等に分割されない場合には
次のページ境界まで増加させます。
関数と
.Fn sbrk
関数は、現代的な仮想メモリ管理が現れる以前の、古いインタフェースです。
.Ef
.Pp
.Fn brk
関数と
.Fn sbrk
関数は、プロセスのデータセグメントに割当てられた
メモリ量を変更するために使用されます。
これは、
.Dq ブレーク
位置を移動することで実現します。
ブレークとは、プロセスの初期化されていないデータ (
.Dq BSS
としても知られています) の後の最初のアドレスのことです。
.Pp
.Fn brk
関数は、ブレークを
.Fa addr
に設定します。
.Pp
.Fn sbrk
関数は、ブレークを
.Fa incr
バイトだけ増し、結果として少なくとも
.Fa incr
バイトの新規メモリをデータセグメントに割当てます。
.Fa incr
が負の場合、ブレークは
.Fa incr
バイトだけ減らされます。
.Sh
カーネルが管理する実際のプロセスデータセグメントサイズは
ページ単位でのみ増減しますが、
これらの関数は、ブレークを境界にあわない値に設定することを許します
(すなわち、データセグメントの最終ページ中の任意のアドレスを指して構いません)。
.Pp
プログラムのブレークの現在値は、
.Fn sbrk 0
を呼び出すことで判定可能です。
.Xr end 3
も参照してください。
.Pp
プログラムブレークの現在の値は、
.Dq Li sbrk(0)
によって信頼性をもって返されます
.Pf ( Xr end 3
も参照)。
.Xr getrlimit 2
システムコールは、
.Em data
データ
セグメントの許容できる最大のサイズを決定するのに利用できます。
.Xr getrlimit 2
.Dq Va etext No + Va rlim.rlim_max
を越えるブレークを設定することはできません。
.Va rlim.rlim_max
.Fn getrlimit RLIMIT_DATA &rlim
の呼び出しから返された
.Em rlim_max
値を越えるブレークを設定することはできません。たとえば、
.Dq Va etext No + Va rlp\->rlim_max
です
.Em rlim.rlim_max
値です
.Pf ( Va etext
の定義については
.Xr end 3
を参照してください)。
.Sh 戻り値
.Fn brk
は、正常に完了すると 0 を返します。それ以外の場合は値 -1 を返し、
割当てが処理失敗した理由を示す
関数は、成功すると
.Po Vt "char *" Pc Ns 0
を返します。
失敗すると値
.Po Vt "char *" Pc Ns \-1
を返し、グローバル変数
.Va errno
が設定されます。
にエラーを表す値を設定します。
.Fn sbrk
関数は、正常に完了すると新しい記憶域のベースを指すポインタを
返します。それ以外の場合は値 \-1 を返し、
割当てが処理失敗した理由を示すグローバル変数
関数は、成功すると古いブレーク値を返します。
失敗すると、値
.Po Vt "char *" Pc Ns \-1
が返し、グローバル変数
.Va errno
が設定されます。
にエラーを表す値を設定します。
.Sh エラー
.Fn brk
または
.Fn sbrk
は、以降のうちの 1 つが真の場合に処理に失敗し、新しくメモリを
割当てられません。
は、以降のうちの 1 つが真の場合に処理に失敗します:
.Bl -tag -width Er
.It Bq Er EINVAL
要求されたブレーク値がデータセグメントの先頭を越えていた。
.It Bq Er ENOMEM
.Xr setrlimit 2
が設定した限界を越えました。
が設定した
データセグメントサイズの限界を越えた。
.It Bq Er ENOMEM
データセグメントの可能な最大サイズ (システム内部にコンパイルされます)
を越えました。
.It Bq Er ENOMEM
展開をサポートするスワップ領域内に不充分な空間が存在しました。
データセグメントの拡張に必要なスワップ領域内の空間が不充分。
.El
.Sh 関連項目
.Xr execve 2 ,
.Xr getrlimit 2 ,
.Xr mmap 2 ,
.Xr end 3 ,
.Xr free 3 ,
.Xr malloc 3
.Sh バグ
ブレークの設定は、スワップ空間の一次的な不足のために処理が失敗する
.Fn brk
または
.Fn sbrk
と、
.Xr malloc 3 ,
.Xr free 3
やこれに類する関数を混在させると、移植不可能なプログラム動作となります。
.Pp
ブレークの設定は、スワップ空間の一時的な不足のために処理が失敗する
可能性があります。これは
.Xr getrlimit 2
を使用せずには、データセグメントの最大サイズを越えることで起こされた
障害と区別することはできません。
を使用せずには、データセグメントの最大サイズを越えたことに起因する
失敗と区別することはできません。
.Sh 歴史
.Fn brk
関数は