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);
}


関連ページ