BRK(2) — UNIX Programmer’s Manual
名称
brk, sbrk − データセグメントのサイズを変更する
形式
int brk(addr)
char ∗addr;
char ∗sbrk(incr)
int incr;
解説
brk は、プログラムによって使用されていないデータセグメントの下限であると、 システムが考えているところ(ブレークと呼ばれる)を addr (システムのページサイズの倍数に切り上げた値)に変更します。 addr より大きくて スタックポインタより下の領域はアドレススペース内にはないので、 アクセスされるとメモリバイオレーションになります。
sbrk では、 プログラムのデータスペースに incr バイトが追加され、新しい領域の開始点を指し示すポインタが返されます。
プログラムが execve で実行を開始すると、ブレークは、そのプログラムとデータ格納領域によって 定義される上限のアドレスにセットされます。 したがって、普通、データ領域の成長するプログラムだけが sbrk を使用する必要があります。
getrlimit(2) システムコールは、 データ セグメントの最大許容サイズを 知るために使用することができます。 getrlimit へのコールから返される rlim_max 値を越えてブレークを セットすることは不可能です。例えば、 “etext + rlp→rlim_max” ( etext の定義については、 end(3) を 参照してください)
リターン値
brk がセットできると、 値 0 が返されます。 プログラムがシステムの制限より多くのメモリを 要求した場合には、 −1 が返されます。 sbrk は、 ブレークがセットできない場合には −1 を 返します。
エラー
以下に示されている項目のうちの 1つが真である場合には、 sbrk は失敗して追加メモリは割り当てられません。
[ENOMEM] setrlimit(2) によってセットされている制限値を オーバーした。
[ENOMEM] (システムで定義されている)データセグメントの最大サイズを オーバーした。
[ENOMEM] スワップ領域内に拡張を サポートするための十分なスペースがない。
関連事項
execve(2), getrlimit(2), malloc(3), end(3)
バグ
ブレークのセットは、 スワップスペースの一時的な不足のために失敗することもあります。 これは、 getrlimit を 使用しない限り、 データセグメントの最大サイズを 超えたことによる失敗と見分けることはできません。
NEWS-OSRelease 3.3