.\" Copyright (c) 1980, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)brk.2 8.4 (Berkeley) 5/1/95 .\" %FreeBSD: src/lib/libc/sys/brk.2,v 1.24 2002/12/18 09:22:30 ru Exp % .\" .\" $FreeBSD$ .Dd July 12, 1999 .Dt BRK 2 .Os .Sh 名称 .Nm brk , .Nm sbrk .Nd データセグメントのサイズを変更する .Sh ライブラリ .Lb libc .Sh 書式 .In sys/types.h .In unistd.h .Ft int .Fn brk "const void *addr" .Ft void * .Fn sbrk "intptr_t incr" .Sh 解説 .Bf -symbolic .Fn brk 関数と .Fn sbrk 関数は、現代的な仮想メモリ管理が現れる以前の、古いインタフェースです。 .Ef .Pp .Fn brk 関数と .Fn sbrk 関数は、プロセスのデータセグメントに割り当てられた メモリ量を変更するために使用されます。 これは、 .Dq ブレーク 位置を移動することで実現します。 ブレークとは、プロセスの初期化されていないデータ ( .Dq BSS としても知られています) の後の最初のアドレスのことです。 .Pp .Fn brk 関数は、ブレークを .Fa addr に設定します。 .Pp .Fn sbrk 関数は、ブレークを .Fa incr バイトだけ増し、結果として少なくとも .Fa incr バイトの新規メモリをデータセグメントに割り当てます。 .Fa incr が負の場合、ブレークは .Fa incr バイトだけ減らされます。 .Sh 注 カーネルが管理する実際のプロセスデータセグメントサイズは ページ単位でのみ増減しますが、 これらの関数は、ブレークを境界にあわない値に設定することを許します (すなわち、データセグメントの最終ページ中の任意のアドレスを指して構いません)。 .Pp プログラムのブレークの現在値は、 .Fn sbrk 0 を呼び出すことで判定可能です。 .Xr end 3 も参照してください。 .Pp .Xr getrlimit 2 システムコールは、 データ セグメントの許容できる最大のサイズを決定するのに利用できます。 .Dq Va etext No + Va rlim.rlim_max を越えるブレークを設定することはできません。 .Va rlim.rlim_max は .Fn getrlimit RLIMIT_DATA &rlim の呼び出しから返された値です .Pf ( Va etext の定義については .Xr end 3 を参照してください)。 .Sh 戻り値 .Rv -std brk .Pp .Fn sbrk 関数は、成功すると古いブレーク値を返します。 失敗すると、値 .Po Vt "void *" Pc Ns \-1 が返し、グローバル変数 .Va errno にエラーを表す値を設定します。 .Sh エラー .Fn brk および .Fn sbrk 関数は、次の場合に処理に失敗します: .Bl -tag -width Er .It Bq Er EINVAL 要求されたブレーク値がデータセグメントの先頭を越えています。 .It Bq Er ENOMEM .Xr setrlimit 2 が設定したデータセグメントサイズの限界を越えています。 .It Bq Er ENOMEM データセグメントの拡張に必要なスワップ領域内の空間が不充分です。 .El .Sh 関連項目 .Xr execve 2 , .Xr getrlimit 2 , .Xr mmap 2 , .Xr end 3 , .Xr free 3 , .Xr malloc 3 .Sh バグ .Fn brk または .Fn sbrk と、 .Xr malloc 3 , .Xr free 3 やこれに類する関数を混在させると、移植性のないプログラム動作となります。 .Pp ブレークの設定は、スワップ空間の一時的な不足のために処理が失敗する 可能性があります。 これは .Xr getrlimit 2 を使用しないと、データセグメントの最大サイズを越えたことに起因する 失敗と区別することはできません。 .Sh 歴史 .Fn brk 関数は .At v7 で登場しました。