table of contents
- bookworm-backports 1:4.24.0-2~bpo12+1
- testing 1:4.24.0-2
- unstable 1:4.24.0-2
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);
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¶
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 |