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
Brak.

HISTORIA
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
Tłumaczenie niniejszej strony podręcznika: 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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.