sbrk

BRK(2)                      Linux Programmer's Manual                     BRK(2)



名前
       brk, sbrk - データセグメントのサイズの変更する

書式
       #include <unistd.h>

       int brk(void *addr);

       void *sbrk(intptr_t increment);

   glibc 向けの機能検査マクロの要件 (feature_test_macros(7)  参照):

       brk(), sbrk():
           glibc 2.12 以降:
               _BSD_SOURCE || _SVID_SOURCE ||
                   (_XOPEN_SOURCE >= 500 ||
                       _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) &&
                   !(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600)
           glibc 2.12 より前: _BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500
           ||
               _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED

説明
       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 ライブラリとカーネル ABI の違い
       上で説明した 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 プロジェクトのリリース 3.79 の一部
       である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。



Linux                              2014-08-19                             BRK(2)