BRK

Section: Linux Programmer's Manual (2)
Updated: 2007-07-26
Index JM Home Page roff page
 

名前

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

書式

#include <unistd.h>

int brk(void *end_data_segment);

void *sbrk(intptr_t increment);

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

brk(), sbrk(): _BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500  

説明

brk() は、データ・セグメント (data segment) の最後を end_data_segment で指定した値に設定する。 システムが十分なメモリを持ち、 プロセスのデータサイズの最大値を超えていなければ、その値は有効である。 (setrlimit(2) を参照)。

sbrk() は、プログラムのデータ空間を increment バイトだけ増やす。 sbrk() は、システム・コールではなく、C ライブラリにあるラッパー (wrapper) である。 increment を 0 にして sbrk() を呼び出すことで、プログラムの現在のブレーク (break) 場所を知ることができる。  

返り値

成功した場合、 brk() は 0 を返す。 エラーの場合には、-1 を返し、 errnoENOMEM を設定する (ただし「LINUX での注意」を参照すること)。

成功した場合、 sbrk() は新しい領域の先頭へのポインタを返す。 エラーの場合には、 -1 を返し、 errnoENOMEM を設定する。  

準拠

4.3BSD, SUSv1. SUSv2 では「過去の名残 (LEGACY)」と位置付けられており、 POSIX.1-2001 で削除された。

brk() と sbrk() は C 規格 (C Standard) には定義されていない。 また POSIX.1 規格からは意図的に除外されている (段落 B.1.1.1.3, B.8.3.3 参照)。  

注意

いろいろなシステムにおいて、 sbrk() の引き数に様々な型が使われている。 一般的なのは int, ssize_t, ptrdiff_t, intptr_t である。  

Linux での注意

上で説明した brk() の返り値についての動作は、 Linux の brk() システムコールをラップする glibc の関数によるものである。 (その他の多くの実装でも、 brk() の返り値はこれと同じである。) しかし、実際の Linux システムコールは、成功した場合、 プログラムの新しいブレークを返す。 失敗した場合、このシステムコールは現在のブレークを返す (よって、 brk(0) という呼び出しで現在のブレークを取得できる)。 glibc ラッパー関数は同様の働きをし、 上で説明した 0 と -1 という返り値を返す。

Linux では sbrk() は brk() システムコールを使うライブラリ関数として実装されており、 以前のブレークの値を返すことができるように内部で調整が行われている。  

関連項目

execve(2), getrlimit(2), malloc(3)


 

Index

名前
書式
説明
返り値
準拠
注意
Linux での注意
関連項目

This document was created by man2html, using the manual pages.
Time: 04:31:33 GMT, November 19, 2007