http://pubs.opengroup.org/onlinepubs/009604499/functions/sigprocmask.html
文档显示了所有需要wait
的信号存储在全局范围变量(在信号线程开始之前填充在main()的示例。
在示例信号线程>> SIG_BLOCK
阻塞信号之后开始。
是否正确并且不会导致某些未定义的行为或崩溃,如果我在 SIG_BLOCK
阻塞主信号()之前创建我的信号线然后我将阻止信号所有其他新创建的线程?
答案 0 :(得分:1)
只要信号线程明确阻止信号,它最终会等待sigwait
,那么它将是安全的。
例如,以下两个流程示例都是安全的:
main:
create_signal_thread() // Inherits mask from main, so signals are not blocked.
block_signals()
create_more_threads() // Inherit mask from main, so signals are blocked.
signal_thread:
block_signals() // Must block signals, as this thread will wait on them.
sigwait() // Behavior is defined.
和
main:
block_signals()
create_signal_thread() // Inherits mask from main, so signals are blocked.
create_more_threads() // Inherit mask from main, so signals are blocked.
signal_thread:
sigwait() // Behavior is defined.
但是,这个例子不安全:
main:
create_signal_thread() // Inherits mask from main, so signals are not blocked.
block_signals()
create_more_threads() // Inherit mask from main, so signals are blocked.
signal_thread:
sigwait() // Behavior is undefined.
以下是sigwait
的相关摘录:
由set定义的信号在调用
sigwait();
时将被阻止,否则行为未定义。sigwait()
对集合中信号的信号动作的影响未指定。