Scroll to navigation

NPTL(7) Руководство программиста Linux NPTL(7)

ИМЯ

nptl - библиотека нитей POSIX

ОПИСАНИЕ

NPTL (Native POSIX Threads Library — библиотека нитей POSIX) это библиотека GNU C, в которой реализованы нити POSIX, используется в современных версиях Linux.

NPTL и сигналы

Внутри NPTL используются два первых сигнала реального времени (с номерами 32 и 33). Один из них служит для поддержки удаления (cancellation) нитей и таймеров POSIX (смотрите timer_create(2)); второй используется как часть механизма обеспечения всех нитей в одном процессе единым UID и GID, как того требует POSIX. Данные сигналы нельзя использовать в приложениях.

Чтобы не допустить случайного использования этих сигналов в приложениях, что может помешать работе реализации NPTL, в различных функциях библиотеки glibc и обёрточных функциях системных вызовов добавлено сокрытие этих сигналов от приложений:

  • Сигнал SIGRTMIN определён со значением 34 (а не 32).
  • Интерфейсы sigwaitinfo(2), sigtimedwait(2) и sigwait(3) игнорируют запросы на ожидание этих сигналов, если но указаны в аргументе набора сигналов.
  • Интерфейсы sigprocmask(2) и pthread_sigmask(3) игнорируют попытки блокировки этих сигналов.
  • Интерфейсы sigaction(2), pthread_kill(3) и pthread_sigqueue(3) завершаются с ошибкой EINVAL (указан некорректный номер сигнала), если заданы эти сигналы.
  • Функция sigfillset(3) не включает эти сигналы при создании полного набора сигналов.

NPTL и изменение идентификаторов процесса

На уровне ядра Linux идентификаторы (пользовательский и групповой ID) являются атрибутов нити. Однако в POSIX требуется, чтобы все нити POSIX одного процесса имели одинаковые идентификаторы. Для удовлетворения этого требования в реализации NPTL для всех системных вызовов, изменяющих идентификаторы процесса, созданы обёрточные функции, которые при обращении к нижележащим вызовам, также изменяют идентификаторы и всем остальным нитям процесса.

В реализации каждого из этих системных вызовов используется сигнал реального времени, который посылается (с помощью tgkill(2)) всем остальным нитях, которым нужно изменить идентификаторы. Перед отправкой этих сигналов, нить, у которой изменяются идентификаторы, сохраняет новые идентификаторы и записывает использующийся системный вызов в глобальный буфер. Обработчик сигнала в принимающей нити извлекает эту информацию и использует тот же системный вызов для изменения своих идентификаторов.

Обёрточные функции, использующие такую же технику: setgid(2), setuid(2), setegid(2), seteuid(2), setregid(2), setreuid(2), setresgid(2), setresuid(2) и setgroups(2).

СООТВЕТСТВИЕ СТАНДАРТАМ

Дополнительную информацию о соответствии NPTL стандарту POSIX находится в pthreads(7).

ЗАМЕЧАНИЯ

В POSIX сказано, что всем нитям процесса с доступом к памяти, содержащей общие для процесса (PTHREAD_PROCESS_SHARED) мьютексы, доступны эти мьютексы. Однако в 64-битных системах с архитектурой x86 определение мьютекса для x86-64 несовместимо с определением для i386, что означает, что исполняемые 32-битные и 64-битные файлы не могут иметь общих мьютексов в системах x86-64.

СМ. ТАКЖЕ

credentials(7), pthreads(7), signal(7), standards(7)

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Alex Nik <rage.iz.me@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

8 августа 2015 г. Linux