多线程程序中sigprocmask和pthread_sigmask的关系

问题描述 投票:0回答:1

sigprocmask(2)
说:

进程中的每个线程都有自己的信号掩码。

,而且:

多线程进程中未指定sigprocmask()的使用; 请参阅 pthread_sigmask(3)。

pthread_sigmask(3)
指出:

pthread_sigmask() 函数与 sigprocmask(2) 类似,不同之处在于它在多线程程序中的使用由 POSIX.1 明确指定。 本页注明了其他差异。

,但没有任何相关注释。

但是https://docs.oracle.com/cd/E19120-01/open.solaris/816-5137/gen-19/index.html说:

在多线程进程中调用

sigprocmask()
相当于调用
pthread_sigmask()

并且拨打

sigprocmask
也可以。

那么打电话

sigprocmask
就省了吗?是故意的吗

c multithreading pthreads sigprocmask
1个回答
0
投票

那么调用sigprocmask就省事了吗?是故意的吗

多线程进程调用 sigprocmask() 不是

可移植
,从某种意义上说 POSIX 标准 说:

sigprocmask()
函数应与
pthread_sigmask()
等效,不同之处在于,如果从多线程进程调用,其行为是未指定的,并且出错时返回 -1 并将
errno
设置为错误号,而不是返回错误直接编号。

关于返回值的部分可能是您正在查看的手册页所说的“本页中提到的”。 这并不一定意味着“在注释部分中呈现”。

如果 Solaris 是您关心的唯一执行环境,那么它的文档似乎确实表明您甚至可以在多线程程序中使用

sigprocmask()
(但不要忽视返回值语义的差异)。 另一方面,如果您想仅依靠 POSIX 来提供广泛的可移植性,那么您不能假设多线程程序调用
sigprocmask()
是安全的。

并且拨打

sigprocmask
也可以。

尝试通过运行 C 代码看看会发生什么来评估 C 代码是否具有明确定义的行为是非常令人担忧的。 即使可观察到的行为似乎是您想要的,您也不能确信不存在任何其他不需要的行为,或者您在其他情况下可能会看到不同的行为。 这样的实验并不能激发我的信心。

© www.soinside.com 2019 - 2024. All rights reserved.