BRK
Section: System Calls (2)
索引
jman
BSD mandoc
索引
名称
brk
sbrk
- データセグメントのサイズを変更する
索引
ライブラリ
Lb libc
索引
書式
In sys/types.h
In unistd.h
Ft int
Fn brk const void *addr
Ft void *
Fn sbrk intptr_t incr
索引
解説
Bf -symbolic
Fn brk
関数と
Fn sbrk
関数は、現代的な仮想メモリ管理が現れる以前の、古いインタフェースです。
Ef
Fn brk
関数と
Fn sbrk
関数は、プロセスのデータセグメントに割り当てられた
メモリ量を変更するために使用されます。
これは、
``ブレーク''
位置を移動することで実現します。
ブレークとは、プロセスの初期化されていないデータ (
``BSS''
としても知られています) の後の最初のアドレスのことです。
Fn brk
関数は、ブレークを
Fa addr
に設定します。
Fn sbrk
関数は、ブレークを
Fa incr
バイトだけ増し、結果として少なくとも
Fa incr
バイトの新規メモリをデータセグメントに割り当てます。
Fa incr
が負の場合、ブレークは
Fa incr
バイトだけ減らされます。
索引
注
カーネルが管理する実際のプロセスデータセグメントサイズは
ページ単位でのみ増減しますが、
これらの関数は、ブレークを境界にあわない値に設定することを許します
(すなわち、データセグメントの最終ページ中の任意のアドレスを指して構いません)。
プログラムのブレークの現在値は、
Fn sbrk 0
を呼び出すことで判定可能です。
end(3)
も参照してください。
getrlimit(2)
システムコールは、
データ
セグメントの許容できる最大のサイズを決定するのに利用できます。
``etext + rlim.rlim_max
''
を越えるブレークを設定することはできません。
rlim.rlim_max
は
Fn getrlimit RLIMIT_DATA &rlim
の呼び出しから返された値です
( etext
の定義については
end(3)
を参照してください)。
索引
戻り値
Rv -std brk
Fn sbrk
関数は、成功すると古いブレーク値を返します。
失敗すると、値
Po Vt void * Pc Ns -1
が返し、グローバル変数
errno
にエラーを表す値を設定します。
索引
エラー
Fn brk
および
Fn sbrk
関数は、次の場合に処理に失敗します:
- Bq Er EINVAL
-
要求されたブレーク値がデータセグメントの先頭を越えています。
- Bq Er ENOMEM
-
setrlimit(2)
が設定したデータセグメントサイズの限界を越えています。
- Bq Er ENOMEM
-
データセグメントの拡張に必要なスワップ領域内の空間が不充分です。
索引
関連項目
execve(2),
getrlimit(2),
mmap(2),
end(3),
free(3),
malloc(3)
索引
バグ
Fn brk
または
Fn sbrk
と、
malloc(3),
free(3)
やこれに類する関数を混在させると、移植性のないプログラム動作となります。
ブレークの設定は、スワップ空間の一時的な不足のために処理が失敗する
可能性があります。
これは
getrlimit(2)
を使用しないと、データセグメントの最大サイズを越えたことに起因する
失敗と区別することはできません。
索引
歴史
Fn brk
関数は
AT&T System
v7
で登場しました。
索引
Index
- 名称
-
- ライブラリ
-
- 書式
-
- 解説
-
- 注
-
- 戻り値
-
- エラー
-
- 関連項目
-
- バグ
-
- 歴史
-
Time: 07:06:24 GMT, January 12, 2009