BRK(2)

명칭
brk, sbrk - 데이터 세그먼트의 사이즈를 변경한다

프로그램 라이브러리
libc

서식
<sys/types.h> <unistd.h> int brk(const void *addr) void * sbrk(intptr_t incr)

해설
brk() 함수와 sbrk() 함수는, 현대적인 가상 메모리 관리가 나타나기 이전의, 낡은 인터페이스입니다.

brk() 함수와 sbrk() 함수는, 프로세스의 데이터 세그먼트에 할당 메모리량을 변경하기 위해서 사용됩니다. 이것은, “브레이크” 위치를 이동하는 것으로 실현됩니다. 브레이크란, 프로세스의 초기화되어 있지 않은 데이터 ( “BSS” (으)로서도 알려져 있습니다)의 후의 최초의 주소입니다.

brk() 함수는, 브레이크를 addr (으)로 설정합니다.

sbrk() 함수는, 브레이크를 incr 바이트만 늘어나, 결과적으로 적어도 incr 바이트의 신규 메모리를 데이터 세그먼트에 할당. incr 하지만 부의 경우, 브레이크는 incr 바이트만 줄여집니다.

주
커널이 관리하는 실제의 프로세스 데이터 세그먼트 사이즈는 페이지 단위에서만 증감합니다만, 이러한 함수는, 브레이크를 경계에 맞지 않는 값으로 설정하는 것을 허락합니다 (즉, 데이터 세그먼트의 최종 페이지중의 임의의 주소를 가리켜 상관하지 않습니다).

프로그램의 브레이크의 현재가는, sbrk(0) (을)를 호출하는 것으로 판정 가능합니다. end(3) 도 참조해 주세요.

getrlimit(2) 시스템 콜은, 데이터 세그먼트(segment)의 허용 할 수 있는 최대의 사이즈를 결정하는데 이용할 수 있습니다. “etext + rlim.rlim_max” (을)를 넘는 브레이크를 설정할 수 없습니다. rlim.rlim_max 하 getrlimit(RLIMIT_DATA, &rlim) 의 호출로부터 돌려주어진 값입니다 (etext 의 정의에 대해서는 end(3) (을)를 참조해 주세요).

반환값

sbrk() 함수는, 성공하면(자) 낡은 브레이크치를 돌려줍니다. 실패하면(자), 값 (void *)-1 하지만 돌려주어, 글로벌 변수 errno 에 에러를 나타내는 값을 설정합니다.

에러
brk() 또는 sbrk() (은)는, 이후 중 1 개가 진정한 경우에 처리에 실패합니다:

[EINVAL]
    요구된 브레이크치가 데이터 세그먼트의 선두를 넘고 있었다.

[ENOMEM]
    setrlimit(2) 하지만 설정했다 데이터 세그먼트 사이즈의 한계를 넘었다.

[ENOMEM]
    데이터 세그먼트의 확장에 필요한 스왑 영역내의 공간이 불충분.

관련 항목
execve(2), getrlimit(2), mmap(2), end(3), free(3), malloc(3)

버그
brk() 또는 sbrk() 라고 malloc(3), free(3) (이)나 이것에 비슷하는 함수를 혼재시키면(자), 이식 불가능한 프로그램 동작이 됩니다.

브레이크의 설정은, 스왑 공간의 일시적인 부족을 위해서(때문에) 처리가 실패한다 가능성이 있습니다. 이것은 getrlimit(2) (을)를 사용하지 않고에는, 데이터 세그먼트의 최대 사이즈를 넘었던 것에 기인한다 실패와 구별할 수 없습니다.

역사
brk() 함수는 AT&T UNIX 그리고 등장했습니다.