BRK
Section: Linux Programmer's Manual (2)
Updated: 2008-06-18
Index
JM Home Page
roff page
名前
brk, sbrk - データ・セグメントのサイズの変更する
書式
#include <unistd.h>
int brk(void *addr);
void *sbrk(intptr_t increment);
glibc 向けの機能検査マクロの要件
(feature_test_macros(7)
参照):
brk(),
sbrk():
_BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500
説明
brk()
と
sbrk()
は
プログラム・ブレーク (program break)
の場所を変更する。
プログラム・ブレークはプロセスのデータ・セグメント (data segment) の
末尾を示す (プログラム・ブレークは、初期化されていない
データ・セグメントの末尾の直後の場所となる)。
プログラム・ブレークを増やすということは、そのプロセスへの
メモリを割り当てる効果があり、
プログラム・ブレークを減らすということは、メモリを解放する
ということである。
brk()
は、データ・セグメントの末尾を
addr
で指定した値に設定する。
設定が行われるのは、指定した値が有効で、
システムに十分なメモリがあり、
プロセスのデータサイズの最大値を超えていない場合である
(setrlimit(2)
を参照)。
sbrk()
は、プログラムのデータ空間を
increment
バイトだけ増やす。
increment
を 0 にして
sbrk()
を呼び出すことで、プログラムの現在のブレーク (break) 場所を知ることができる。
返り値
成功した場合、
brk()
は 0 を返す。
エラーの場合には、-1 を返し、
errno
に
ENOMEM
を設定する
(ただし「LINUX での注意」を参照すること)。
成功した場合、
sbrk()
は変更前のプログラム・ブレークを返す
(プログラム・ブレークが増やされた場合、この値は
新しく割り当てられたメモリの先頭を指すポインタとなる)。
エラーの場合には、
(void *) -1
を返し、
errno
に
ENOMEM
を設定する。
準拠
4.3BSD, SUSv1.
SUSv2 では「過去の名残 (LEGACY)」と位置付けられており、
POSIX.1-2001 で削除された。
注意
brk()
や
sbrk()
を使用するのは避けること。
malloc(3)
メモリ割り当てパッケージの方が、移植性が高く、
使いやすいメモリ割り当て方法を提供している。
いろいろなシステムにおいて、
sbrk()
の引き数に様々な型が使われている。
一般的なのは int, ssize_t, ptrdiff_t, intptr_t である。
Linux での注意
上で説明した
brk()
の返り値についての動作は、
Linux の
brk()
システムコールをラップする glibc の関数によるものである。
(その他の多くの実装でも、
brk()
の返り値はこれと同じである。
この返り値は SUSv2 でも規定されている。)
しかし、実際の Linux システムコールは、成功した場合、
プログラムの新しいブレークを返す。
失敗した場合、このシステムコールは現在のブレークを返す。
glibc ラッパー関数は同様の働きをし
(すなわち、新しいブレークが
addr
より小さいかどうかをチェックし)、
上で説明した 0 と -1 という返り値を返す。
Linux では
sbrk()
は
brk()
システムコールを使うライブラリ関数として実装されており、
以前のブレークの値を返すことができるように内部で調整が行われている。
関連項目
execve(2),
getrlimit(2),
end(3),
malloc(3)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- 準拠
-
- 注意
-
- Linux での注意
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 03:26:37 GMT, April 25, 2010