brk() - スペース割り振りの変更

標準

標準/拡張機能 C/C++ 依存項目
XPG4.2 両方  

形式

#define _XOPEN_SOURCE_EXTENDED 1
#include <unistd.h>

int brk(void *addr);

機能説明

制約事項: この関数は、AMODE 64 ではサポートされません。

brk() 関数は、呼び出しプロセスに割り振られたスペースを変更する ために使用します。プロセスのブレーク値を addr に設定し、適切な大きさの スペースを割り振ることにより、変更を行います。割り振られるスペースの大きさは、ブレーク値の増加 に従って増加します。新しく割り振られるスペースは 0 に設定されます。ただし、アプリケーションによりブレーク値が減分されてから、その値が増分される場合は、再割り振りされたスペースの内容はゼロになりません。

brk() および sbrk() 関数がストレージを割り振る元である ストレージ・スペースは、ほかの メモリー割り振り関数 (malloc()、calloc() など) が使用する ストレージ・スペースから分かれています。このストレージ・スペースはストレージの連続セグメントでなければならないため、これが割り振られるのは初期ヒープ・セグメントからだけです。そのため、このストレージ・スペースは、呼び出し側プログラム用に指定された初期ヒープ・サイズ、あるいは最初の brk() または sbrk() 呼び出しの時点で初期ヒープで使用できるストレージの最大連続セグメントの制限を受けます。このスペースはストレージの別個のセグメントなので、他のメモリー割り振り関数を使用しているアプリケーションで brk() および sbrk() 関数を使用することができます。しかし、ユーザー領域が、両方のタイプのメモリー割り振りの拡張使用をサポートできるほど大きくはない可能性があります。

以前は、brk() 関数の使用は、ほかのメモリー割り振り関数が同じ関数を実行していないという、特殊なケースに限定されていました。呼び出しアプリケーションがほかのメモリー関数を使用していると、brk() 関数は、プロセスのスペース割り振りを十分に増やすことができない場合があるため、現在はほかのメモリー割り振り関数 (mmap() など) のほうが優先的に使用されています。これは、その他のすべてのメモリー割り振り関数、およびその他の割り振り関数を使用する任意の関数とともに移植可能な形で使用できるからです。 brk() または sbrk() (あるいはその両方) を使用しなければならないアプリケーションでは、他のメモリー割り振り関数を使用しないで、プログラムの最大ストレージ要件を満たす 初期ヒープ・サイズで実行してください。brk() 関数は、マルチスレッド環境からはサポートされません。マルチスレッド環境でこの関数を呼び出すと、エラーになって戻ること になります。

注:

この関数は、従来からの運用上の理由から提供されます。 これは Single UNIX Specification、バージョン 2 のレガシー機能でしたが、 既に廃止され、Single UNIX Specification、バージョン 3 の一部として サポートされていません。新しいアプリケーションでは、brk() または sbrk() の代わりに malloc() を使用してください。

Single UNIX Specification、バージョン 3 のために 書かれたアプリケーションで、この関数を引き続き使う必要がある場合は、 標準システム・ヘッダーを組み込む前に、フィーチャー・テスト・マクロ _UNIX03_WITHDRAWN を 定義してください。マクロは、Single UNIX Specification、バージョン 3 に移動された すべてのインターフェースおよびシンボルを公開します。

戻り値

brk() は、正常終了の場合は、0 を戻します。

正常に実行されなかった場合、brk() は、-1 を戻して、errno を次のいずれかの値に設定します。
エラー・コード
説明
ENOMEM
要求された変更で、呼び出しプロセスに許可された以上に大きいスペースが 割り振られることになります。

関連情報