table of contents
nptl(7) | Miscellaneous Information Manual | nptl(7) |
NAZWA¶
nptl - natywna biblioteka wątków POSIX
OPIS¶
NPTL (Native POSIX Threads Library) jest implementacją wątków POSIX w bibliotece GNU C, która jest używana na współczesnych systemach linuksowych.
NPTL i sygnały¶
NPTL korzysta wewnętrznie z dwóch pierwszych sygnałów czasu rzeczywistego (numery sygnałów 32 i 33). Jeden z nich służy do obsługi anulacji wątków i czasomierzy POSIX (zob. timer_create(2)); drugi jest częścią mechanizmu zapewniającego, że wszystkie wątki procesu zawsze mają takie same UID-y i GID-y tak, jak wymaga tego POSIX. Sygnałów tych nie można stosować w aplikacjach.
Aby uniknąć przypadkowego korzystania z opisanych sygnałów w aplikacjach, co mogłoby kłócić się z działaniem implementacji NPTL, różne funkcje biblioteczne glibc i funkcje opakowujące wywołania systemowe starają się ukryć te sygnały przed aplikacjami, a więc:
- •
- SIGRTMIN jest zdefiniowany z wartością 34 (zamiast 32).
- •
- Interfejsy sigwaitinfo(2), sigtimedwait(2) i sigwait(3) po cichu ignorują żądania oczekiwania na te dwa sygnały, jeśli poda się je w zbiorze sygnałów, będącym argumentem tych wywołań.
- •
- Interfejsy sigprocmask(2) i pthread_sigmask(3) po cichu ignorują próby blokowania tych dwóch sygnałów.
- •
- Interfejsy sigaction(2), pthread_kill(3) i pthread_sigqueue(3) zawiodą z błędem EINVAL (wskazującym nieprawidłowy numer sygnału), jeśli poda się te sygnały.
- •
- sigfillset(3) nie obejmuje tych dwóch sygnałów, gdy tworzy pełny zbiór sygnałów.
NPTL i zmiany poświadczeń procesu¶
Poświadczenia (identyfikatory użytkownika i grupy) na poziomie jądra Linux są atrybutem przynależnym wątkowi. Jednak POSIX wymaga, aby wszystkie wątki POSIX procesu miały te same poświadczenia. Aby uwzględnić to wymaganie, implementacja NPTL opakowuje wszystkie wywołania systemowe zmieniające poświadczenia procesu funkcją, która oprócz przywołania odpowiedniego wywołania systemowego, doprowadza do zmiany poświadczeń również przez inne wątki procesu.
Implementacja każdego z tych wywołań systemowych obejmuje użycie sygnału czasu rzeczywistego, który jest wysyłany (za pomocą tgkill(2)) do każdego z innych wątków, który musi zmienić swoje poświadczenia. Przed wysłaniem tych sygnałów wątek zmieniający poświadczenia zapisuje nowe poświadczenia i odnotowuje wykorzystywane wywołanie systemowe w globalnym buforze. Procedura obsługi sygnału w odbierającym wątku/wątkach pobiera tę informację i używa tego samego wywołania systemowego do zmiany swoich poświadczeń.
Funkcje opakowujące korzystające z tej techniki są dostarczane dla setgid(2), setuid(2), setegid(2), seteuid(2), setregid(2), setreuid(2), setresgid(2), setresuid(2) i setgroups(2).
STANDARDY¶
Szczegóły na temat zgodności NPTL ze standardem POSIX opisano w podręczniku pthreads(7).
UWAGI¶
POSIX nakazuje, aby każdy wątek każdego procesu z dostępem do pamięci, zawierający współdzielony na poziomie procesu (PTHREAD_PROCESS_SHARED) mutex, mógł działać na tym muteksie. Jednak na 64-bitowych systemach x86, definicja muteksu dla x86-64 jest niekompatybilna z definicją muteksu dla i386 co oznacza, że 32-bitowe i 64-bitowe pliki wykonywalne nie mogą dzielić muteksów na systemach x86-64.
ZOBACZ TAKŻE¶
TŁUMACZENIE¶
Tłumaczenie niniejszej strony podręcznika: 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.
2 maja 2024 r. | Linux man-pages 6.9.1 |