说明

NPTL(本地POSIX线程库)是在现代Linux系统上使用的GNU C库POSIX线程实现。

NPTL and signals

NPTL内部使用前两个实时信号(信号编号32和33)。这些信号之一用于支持线程取消和POSIX计时器(请参见timer_create(2))。另一个用作机制的一部分,以确保进程中的所有线程始终具有POSIX要求的相同的UID和GID。这些信号不能在应用中使用。

为防止在应用程序中意外使用这些信号,而这可能会干扰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 and process credential changes

在Linux内核级别,凭据(用户和组ID)是每个线程的属性。但是,POSIX要求进程中的所有POSIX线程都具有相同的凭据。为了适应此需求,NPTL实现将所有更改流程凭据的系统调用包装为功能,这些功能除了调用基础系统调用之外,还安排流程中的所有其他线程也更改其凭据。

每个这些系统调用的实现都涉及使用实时信号,该信号被发送(使用tgkill(2))到必须更改其凭据的每个其他线程。在发送这些信号之前,正在更改凭据的线程将保存新的凭据,并将正在使用的系统调用记录在全局缓冲区中。接收线程中的信号处理程序会获取此信息,然后使用相同的系统调用来更改其凭据。

setgid(2),setuid(2),setegid(2),seteuid(2),setregid(2),setreuid(2),setresgid(2),setresuid(2)和setgroup提供了采用此技术的包装函数。 (2)。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

NPTL - Linux手册页

Linux程序员手册 第7部分
更新日期: 2015-08-08

名称

nptl-本机POSIX线程库

遵循规范

有关NPTL符合POSIX标准的详细信息,请参见pthreads(7)。

备注

POSIX表示,任何进程中的任何线程都可以访问包含进程共享(PTHREAD_PROCESS_SHARED)互斥锁的内存,并且可以在该互斥锁上进行操作。但是,在64位x86系统上,x86-64的互斥锁定义与i386的互斥锁定义不兼容,这意味着32位和64位二进制文​​件不能在x86-64系统上共享互斥锁。

另外参见

凭证(7),pthreads(7),signal(7),标准(7)

日期:2019-08-20 18:02:00 来源:oir作者:oir