Scroll to navigation

brk(2) System Calls Manual brk(2)

NAZWA

brk, sbrk - zmienia wielkość segmentu danych

BIBLIOTEKA

Standardowa biblioteka C (libc, -lc)

SKŁADNIA

#include <unistd.h>
int brk(void *addr);
void *sbrk(intptr_t increment);

Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

brk(), sbrk():


Od glibc 2.19:
_DEFAULT_SOURCE
|| ((_XOPEN_SOURCE >= 500) &&
! (_POSIX_C_SOURCE >= 200112L))
glibc 2.12 do glibc 2.19:
_BSD_SOURCE || _SVID_SOURCE
|| ((_XOPEN_SOURCE >= 500) &&
! (_POSIX_C_SOURCE >= 200112L))
Przed glibc 2.12:
_BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500

OPIS

brk() i sbrk() zmieniają położenie punktu zakończenia programu, definiującego koniec segmentu danych procesu (tzn. punkt zakończenie programu jest pierwszym położeniem po końcu niezainicjowanego segmentu danych). Zwiększenie punktu zakończenia programu w efekcie zwiększa przydzieloną procesowi pamięć; zmniejszenie - cofa przydzielenie pamięci.

brk() ustawia koniec segmentu danych na wartość podaną jako argument addr, o ile wartość ta jest sensowna, system posiada dostateczną ilość pamięci oraz nie zostanie przekroczona maksymalna wielkość segmentu danych dla procesu (zobacz setrlimit(2)).

sbrk() zwiększa przestrzeń danych programu o wartość increment bajtów. Wywołanie sbrk() z increment równym 0 może służyć do znalezienia aktualnej lokalizacji punktu zakończenia programu.

WARTOŚĆ ZWRACANA

Po pomyślnym zakończeniu brk() zwraca zero. Po błędzie zwracane jest -1, a errno ustawiane jest na ENOMEM.

Po pomyślnym zakończeniu, sbrk() zwraca poprzedni punkt zakończenia programu (jeśli go zwiększono, to wartość ta wskazuje na początek nowo przydzielonej pamięci). W przypadku błędu zwracane jest (void *) -1 a errno nadawana jest wartość ENOMEM.

STANDARDY

4.3BSD; SUSv1, oznaczone jako LEGACY (przestarzałe) w SUSv2, usunięte w POSIX.1-2001.

UWAGI

Nie zaleca się używania brk() i sbrk(): przenośnym i wygodnym sposobem przydzielania pamięci jest pakiet malloc(3).

Różne systemy używają różnych typów argumentu sbrk(). Powszechne są: int, ssize_t, ptrdiff_t, intptr_t.

Różnice biblioteki C/jądra

Zwracana wartość opisana powyżej dla brk() jest zachowaniem udostępnianym przez funkcję opakowującą z glibc dla wywołania systemowego brk() Linuksa (w większości innych implementacji, zwracana wartość brk() jest taka sama; takąż określono również w SUSv2). Jednak rzeczywiste linuksowe wywołanie systemowe zwraca przy pomyślnym zakończeniu nowy punkt zakończenia programu. W przypadku błędu, wywołanie systemowe zwraca bieżący punkt zakończenia. Funkcja opakowująca z glibc czyni pewne starania (tj. sprawdza, czy nowy punkt zakończenia wynosi mniej niż addr), aby udostępnić opisane wyżej zwracane wartości 0 i -1.

W Linuksie, sbrk() zaimplementowano jako funkcję biblioteczną korzystającą z wywołania systemowego brk(), która dokonuje pewnego wewnętrznego księgowania, dzięki czemu może zwrócić wartość starego punktu zakończenia programu.

ZOBACZ TAKŻE

execve(2), getrlimit(2), end(3), malloc(3)

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.

4 grudnia 2022 r. Linux man-pages 6.03