BRK
Section: Linux Programmer's Manual (2)
Updated: 2016-03-15
Index JM Home Page
名前
brk, sbrk - データセグメントのサイズの変更する
書式
#include <unistd.h>
int brk(void *addr);
void *sbrk(intptr_t increment);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
brk(), sbrk():
-
- glibc 2.19 以降:
-
_DEFAULT_SOURCE ||
(_XOPEN_SOURCE >= 500) &&
! (_POSIX_C_SOURCE >= 200112L)
- glibc 2.12 から 2.19 まで:
-
_BSD_SOURCE || _SVID_SOURCE ||
(_XOPEN_SOURCE >= 500) &&
! (_POSIX_C_SOURCE >= 200112L)
- glibc 2.12 より前:
- _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 を設定する。
成功した場合、 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 である。
C ライブラリとカーネルの違い
上で説明した brk() の返り値についての動作は、 Linux の brk() システムコールをラップする glibc の関数によるものである。 (その他の多くの実装でも、 brk() の返り値はこれと同じである。 この返り値は SUSv2 でも規定されている。) しかし、実際の Linux システムコールは、成功した場合、 プログラムの新しいブレークを返す。 失敗した場合、このシステムコールは現在のブレークを返す。 glibc ラッパー関数は同様の働きをし (すなわち、新しいブレークが addr より小さいかどうかをチェックし)、 上で説明した 0 と -1 という返り値を返す。
Linux では sbrk() は brk() システムコールを使うライブラリ関数として実装されており、 以前のブレークの値を返すことができるように内部で調整が行われている。
関連項目
execve(2), getrlimit(2), end(3), malloc(3)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
関連キーワード
ブレーク,
brk,
SOURCE,
プログラム,
sbrk,
BRK,
メモリー,
データ,
設定,
セグメント
Linux マニュアル 一覧
[man1]
[man2]
[man3]
[man4]
[man5]
[man6]
[man7]
[man8]
[a]
[b]
[c]
[d]
[e]
[f]
[g]
[h]
[i]
[j]
[k]
[l]
[m]
[n]
[o]
[p]
[q]
[r]
[s]
[t]
[u]
[v]
[w]
[x]
[y]
[z]
Index
- 名前
- 書式
- 説明
- 返り値
- 準拠
- 注意
-
- C ライブラリとカーネルの違い
- 関連項目
- この文書について
This document was created by man2html, using the manual pages.
Time: 12:08:48 GMT, June 11, 2022