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
就省了吗?是故意的吗
那么调用sigprocmask就省事了吗?是故意的吗
多线程进程调用 sigprocmask()
不是
可移植,从某种意义上说 POSIX 标准 说:
函数应与sigprocmask()
等效,不同之处在于,如果从多线程进程调用,其行为是未指定的,并且出错时返回 -1 并将pthread_sigmask()
设置为错误号,而不是返回错误直接编号。errno
关于返回值的部分可能是您正在查看的手册页所说的“本页中提到的”。 这并不一定意味着“在注释部分中呈现”。
如果 Solaris 是您关心的唯一执行环境,那么它的文档似乎确实表明您甚至可以在多线程程序中使用
sigprocmask()
(但不要忽视返回值语义的差异)。 另一方面,如果您想仅依靠 POSIX 来提供广泛的可移植性,那么您不能假设多线程程序调用 sigprocmask()
是安全的。
并且拨打
也可以。sigprocmask
尝试通过运行 C 代码看看会发生什么来评估 C 代码是否具有明确定义的行为是非常令人担忧的。 即使可观察到的行为似乎是您想要的,您也不能确信不存在任何其他不需要的行为,或者您在其他情况下可能会看到不同的行为。 这样的实验并不能激发我的信心。