日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
BRK(2) FreeBSD システムコールマニュアル BRK(2)
名称
brk, sbrk -- データセグメントのサイズを変更する
ライブラリ
標準 C ライブラリ (libc, -lc)
書式
#include <unistd.h>
int
brk(const void *addr);
void *
sbrk(intptr_t incr);
解説
brk() と sbrk() 関数は、現代の仮想メモリ管理の出現の前の古いインタフェー
スです。それらは、arm64 または riscv アーキテクチャに存在せず、推奨されま
せん。mmap(2) インタフェースは、代わりにページを割り付けるために使用され
るべきです。
brk() と sbrk() 関数は、プロセスのデータセグメントに割り付けられるメモリ
の量を変更するために使用されます。それらは、``break'' の位置を移動するこ
とによってこれを行います。ブレークは、プロセスの初期化されないデータセグ
メントの終わりの後の最初のアドレスです (また、``BSS'' として知られていま
す)。
brk() 関数は、ブレークを addr に設定します。
sbrk() 関数は、incr バイトによってブレークを起こし、したがって、少なくと
も incr バイトの新しいメモリをデータセグメントの割り付けます。incr が負で
あるなら、ブレークは、incr バイトずつ減されます。
注
カーネルによって管理される実際のプロセスデータのセグメントサイズは、ペー
ジサイズの単位で増加するか、または縮小し、これらの関数は、整列されない値
にブレークを設定することを許可します (すなわち、それは、データセグメント
の最後のページ内のあらゆるアドレスを指すことができます)。
プログラムのブレークの現在の値は、sbrk(0) を呼び出すことによって決定でき
ます。また end(3) を参照してください。
getrlimit(2) システムコールは、データセグメントの最大の許容されているサイ
ズを決定するために使用されます。``etext + rlim.rlim_max'' を越えるブレー
クを設定することはできません、ここで、rlim.rlim_max 値は、
getrlimit(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() 関数は、Version 7 AT&T UNIX で登場しました。FreeBSD 11.0 は、brk()
または sbrk() をサポートしない arm64 と riscv アーキテクチャを導入しまし
た。
バグ
malloc(3), free(3) または同様な関数と brk() または sbrk() を混合すること
は、移植性のないプログラムの振る舞いの結果となります。
ブレークを設定することは、スワップ空間の一時的な不足のため失敗するかもし
れません。これは、getrlimit(2) で調べずにデータセグメントの最大のサイズを
越えることによって起こされる失敗と区別することができません。
sbrk() は、0 の引数で呼び出すことによってヒープ (heap) を監視するために、
時々使用されます。結果は、mmap(2) 基づいた malloc と組み合わせて実際の利
用を反映することはありそうもありません。
brk() と sbrk() は、スレッドセーフではありません。
FreeBSD 13.2 June 2, 2018 FreeBSD 13.2