Scroll to navigation

getpid(2) System Calls Manual getpid(2)

NAZWA

getpid, getppid - pobiera identyfikator procesu

BIBLIOTEKA

Standardowa biblioteka C (libc, -lc)

SKŁADNIA

#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);

OPIS

getpid() zwraca identyfikator procesu (PID) wywołującego (jest to często wykorzystywane przez funkcje generujące unikatowe nazwy plików tymczasowych).

getppid() zwraca identyfikator procesu (PID) macierzystego względem procesu wywołującego. Będzie to albo identyfikator procesu, który utworzył ten proces za pomocą fork(), albo, jeśli tamten proces już się zakończył, identyfikator procesu, do którego proces ten został zaadoptowany (albo przez init(1), albo przez proces „dorzynający” (ang. „subreaper”) zdefiniowany przez operację PR_SET_CHILD_SUBREAPER prctl(2)).

BŁĘDY

Funkcje te zawsze kończą się pomyślnie.

STANDARDY

POSIX.1-2001, POSIX.1-2008, 4.3BSD, SVr4.

UWAGI

Jeśli rodzic wywołującego jest w innej przestrzeni nazw PID (zob. pid_namespaces(7)), getppid() zwraca 0.

Z punktu widzenia jądra, PID (który jest dzielony przez wszystkie wątki w procesie wielowątkowym) jest również czasem znany jako identyfikator grupy wątków (ang. thread group ID — TGID). Różni się on od identyfikatora wątku jądra (TID), który jest unikatowy dla każdego wątku. Więcej informacji znajduje się w podręczniku gettid(2) oraz w opisie znacznika CLONE_THREAD w clone(2).

Różnice biblioteki C/jądra

Od glibc 2.3.4 do glibc 2.24 włącznie, funkcja opakowująca dla getpid() buforowała identyfikatory procesów, w celu unikania dodatkowych wywołań systemowych, jeśli proces powtarza wywołania getpid(). Zwykle było to niewidoczne, ale poprawne działanie tego mechanizmu zależało od wsparcia w funkcjach opakowujących fork(2), vfork(2) i clone(2): jeżeli aplikacja omijała funkcje opakowujące biblioteki glibc, używając syscall(2), to getpid() w procesie potomnym zwracało niepoprawną wartość (a dokładniej: zwracało identyfikator procesu macierzystego). Oprócz tego, występowały sytuacje, gdzie getpid() mogło zwrócić niepoprawną wartość, nawet jeżeli clone(2) uruchomiono poprzez funkcję opakowującą biblioteki glibc (więcej informacji o takim przypadku opisano w rozdziale USTERKI w clone(2)). Co więcej, złożoność kodu buforującego była źródłem kilku błędów w glibc na przestrzeni lat.

Z powodu opisywanych problemów, od glibc 2.25 bufor PID został usunięty: wywołanie do getpid() zawsze przywoła rzeczywiste wywołanie systemowe, zamiast zwracać wartość zbuforowaną.

Na Alpha, zamiast pary wywołań systemowych getpid() i getppid(), udostępniane jest pojedyncze wywołanie systemowe getxpid(), które zwraca parę: identyfikatora procesu oraz identyfikatora procesu macierzystego. Funkcje opakowujące getpid() i getppid() biblioteki glibc robią to w sposób przezroczysty. Więcej informacji o przypisywaniu rejestrów znajduje się w podręczniku syscall(2).

ZOBACZ TAKŻE

clone(2), fork(2), gettid(2), kill(2), exec(3), mkstemp(3), tempnam(3), tmpfile(3), tmpnam(3), credentials(7), pid_namespaces(7)

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys <pborys@dione.ids.pl>, Robert Luberda <robert@debian.org> 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.

22 stycznia 2023 r. Linux man-pages 6.03