Manpages

名 前

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 を 返 し 、 errnoENOMEM を 設 定 す る 。 成 功 し た 場 合 、 sbrk() は 変 更 前 の プ ロ グ ラ ム ブ レ ー ク を 返 す (プ ロ グ ラ ム ブ レ ー ク が 増 や さ れ た 場 合 、 こ の 値 は 新 し く 割 り 当 て ら れ た メ モ リ ー の 先 頭 を 指 す ポ イ ン タ ー と な る )。 エ ラ ー の 場 合 に は 、 (void *) −1 を 返 し 、 errnoENOMEM を 設 定 す る 。

準 拠

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/ に 書 か れ て い る 。