C言語システムコール-brk
brkシステムコール
概要
brkはヒープ領域のブレーク値を変更します。
プロセスのメモリ未割り当て領域を「ヒープ」といい、ヒープ上の未割り当てメモリの先頭アドレスを「ブレーク値」といいます。
brkシステムコール及びsbrkシステムコールを利用してブレーク値を変更することで、メモリの割り当てと解放を行うことができます。
brkシステムコールはプロセスに新しいブレーク値を任意に設定します。
指定したブレーク値が現在のブレーク値より大きい場合には、ヒープ領域にメモリを割り当てます。
指定したブレーク値が現在のブレーク値より小さい場合には、ヒープ領域に動的に割り当てられたメモリを解放します。
sbrkシステムコールはブレーク値をバイト数指定で加算します。
整数を指定してsbrkを実行すると、ヒープ領域にメモリを動的に割り当てます。
負数を指定してsbrkを実行すると、その分のメモリは解放されます。
brkとsbrkはCライブラリ関数のmalloc()で利用されています。
同一プログラム上でmalloc()とbrk/sbrkを同時に使用すると、動作が不正になる可能性があります。
一般的に、brk/sbrkによるメモリ管理は推奨されていません。
malloc()では、小さいメモリ領域の割り当てを行う際にはbrk/sbrkを利用していますが、大きなメモリ領域を割り当てる場合にはmmapシステムコール(MAP_ANONYMOUS)を利用しています。
サンプルプログラム
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
/*!
* @brief sample
* @param[in] str 任意の文字列
* @return 0:success/-1:failure
*/
static int
sample_func(char *str)
{
int length = 0;
char *cp = NULL;
char *bp = NULL;
length = strlen(str);
if(length < 0){
printf("Error: strlen() %s\n", strerror(errno));
return(-1);
}
/* メモリ領域の確保 */
cp = (char *)sbrk(length + 1);
if(cp == NULL){
printf("Error: sbrk() %s\n", strerror(errno));
return(-1);
}
/* メモリ確保の確認 */
strcpy(cp, str);
printf("%s\n", cp);
/* メモリ解放 */
bp = brk(cp);
if(bp == NULL){
printf("Error: brk() %s\n", strerror(errno));
return(-1);
}
return(0);
}
int
main(int argc, char *argv[])
{
int rc = 0;
if(argc != 2){
fprintf(stderr, "Usage: %s <str>\n", argv[0]);
exit(EXIT_FAILURE);
}
rc = sample_func(argv[1]);
if(rc != 0) exit(EXIT_FAILURE);
exit(EXIT_SUCCESS);
}