名称
brk, sbrk ― データセグメントの領域の割当て変更
構文
#include <unistd.h>
int brk(const void *endds);
void *sbrk(int incr);
説明
brk() と sbrk() は、呼び出しプロセスのデータセグメントに割り当てられる領域の量を
動的に変更するために使われます exec(2) を参照してください)。
変更はプロセスのブレーク値をリセットし、適当な量の領域を割り当てる
ことで行われます。 ブレーク値は、データセグメントの上限を越える最初のロケーションの
アドレスです。 割り当てられる領域の量は、ブレーク値が増えた分だけ増加します。
新しく割り当てられる領域は 0 にセットされます。
brk() は、ブレーク値を endds に設定し、それに応じて割り当てられる領域を変更します。
sbrk() は、 ブレーク値を incr バイトだけ増加させ、それに応じて割り当てられる領域を変更します。 incr は負の数の場合、割り当てられる領域の量は減少します。
エラー
brk() と sbrk() は、次の条件のいずれかを満たす場合に、割り当てられた領域を変更せずに失敗します。
| [ENOMEM] | | システムによって決められた最大値を越える領域を割り当てようとした場合 ulimit(2) を参照してください)。 |
| [ENOMEM] | | データセグメント内のアドレスと、結び付けられた共有メモリーセグメントの
間で、衝突が起こった場合 shmop(2) を参照してください)。 |
| [ENOMEM] | | 利用可能なスワップ領域が十分に存在していない場合。 |
| [EINVAL] | | 対象範囲が境界を超えて、呼び出し元プロセスのデータセグメント内の非初期化データに及ぶ場合。 |
警告
sbrk() が返すポインターは、必ずしもワードで割つけられているとは限りません。
このようなポインターを用いたワードのロードやストアは、ワード境界
問題を引き起こします。
malloc(3C) ライブラリルーチン呼び出しとともに、 brk か sbrk のどちらかを使う場合は、特に注意してください。
これらルーチン 3 つすべてが、プログラム データメモリーを割り当てたり、
その割当てを解除したりするプログラム データセグメントは 1 つしかありません。
戻り値
正常終了すると、 brk() は値 0 を返します。それ以外は
-1 を返し、 errno に、エラーの種類を示す値がセットされます。
正常終了すると、 sbrk() は古いブレーク値を返します。それ以外は SBRK_FAILED を返し、 errno に、エラーの種類を示す値がセットされます。記号 SBRK_FAILED はヘッダー <unistd.h>
に定義されています。 sbrk() が正常に終了しない場合は、値 SBRK_FAILED を返します。
著者
brk() と sbrk() は、AT&T
と HP で開発されました。
参照
exec(2), shmop(2), ulimit(2), end(3C), malloc(3C)
標準準拠
brk(): XPG2
sbrk(): XPG2