スポンサーリンク

BRK(2) FreeBSD システムコールマニュアル BRK(2)

名称

brk, sbrk − データセグメントのサイズを変更する

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <sys/types.h>
#include <unistd.h>

int

brk(const void *addr);

void *

sbrk(intptr_t incr);

解説

brk() 関数と sbrk() 関数は、現代的な仮想メモリ管理が現れる以前の、古いイ ンタフェースです。

brk() 関数と sbrk() 関数は、プロセスのデータセグメントに割り当てられたメ モリ量を変更するために使用されます。これは、 ‘‘ブレーク’’ 位置を移動する ことで実現します。ブレークとは、プロセスの初期化されていないデータ ( ‘‘BSS’’ としても知られています) の後の最初のアドレスのことです。

brk() 関数は、ブレークを addr に設定します。

sbrk() 関数は、ブレークを incr バイトだけ増し、結果として少なくとも incr バイトの新規メモリをデータセグメントに割り当てます。 incr が負の場合、ブ レークは incr バイトだけ減らされます。

カーネルが管理する実際のプロセスデータセグメントサイズはページ単位でのみ 増減しますが、これらの関数は、ブレークを境界にあわない値に設定することを 許します (すなわち、データセグメントの最終ページ中の任意のアドレスを指し て構いません)。

プログラムのブレークの現在値は、 sbrk(0) を呼び出すことで判定可能です。 end(3) も参照してください。

getrlimit(2) システムコールは、データセグメントの許容できる最大のサイズを 決定するのに利用できます。 ‘‘etext + rlim.rlim_max’’ を越えるブレークを設 定することはできません。 rlim.rlim_maxgetrlimit(RLIMIT_DATA, &rlim) の呼び出しから返された値です (etext の定義については end(3) を参照してく ださい)。

戻り値

関数 brk() は、処理が成功すると値 0 を返します。そうでない場合、値 -1 が 返され、グローバル変数 errno が設定されてエラーを示します。

sbrk() 関数は、成功すると古いブレーク値を返します。失敗すると、値 (

                                                                          void*)−1 が返し、グローバル変数 errno にエラーを表す値を設定します。

エラー

brk() および sbrk() 関数は、次の場合に処理に失敗します:

       [EINVAL]

要求されたブレーク値がデータセグメントの先頭を越えてい ます。

[ENOMEM]
setrlimit(2) が設定したデータセグメントサイズの限界を 越えています。

[ENOMEM]
データセグメントの拡張に必要なスワップ領域内の空間が不 充分です。

関連項目

execve(2), getrlimit(2), mmap(2), end(3), free(3), malloc(3)

バグ

brk() または sbrk() と、 malloc(3), free(3) やこれに類する関数を混在させ ると、移植性のないプログラム動作となります。

ブレークの設定は、スワップ空間の一時的な不足のために処理が失敗する可能性 があります。これは getrlimit(2) を使用しないと、データセグメントの最大サ イズを越えたことに起因する失敗と区別することはできません。

歴史

brk() 関数は Version 7 AT&T UNIX で登場しました。

FreeBSD 10.0 July 12, 1999 FreeBSD 10.0

スポンサーリンク