我做了以下事情:
克隆线程是否也在监听SIGVTALRM?那么当SIGVTALRM被触发时,两个线程都会调用信号处理程序吗?另外,在创建新线程之后,我可以将SIGVTALRM的signalhandler更改为另一个函数而不影响主线程signalhandler吗?
我猜这取决于传递给clone()的标志。主要是,我正在使用CLONE_SIGHAND和SIGCHLD。它也依赖于其他标志吗?
答案 0 :(得分:1)
这完全取决于您是否为克隆系统调用指定了CLONE_THREAD
。如果您执行不,则子项不会继承itimer(因此在计时器到期时不会发出信号)。它仍然会安装一个信号处理程序。
如果您执行指定CLONE_THREAD
,则该子项被视为属于与父项相同的进程。当计时器到期时,一个线程将被发出信号(并运行信号处理程序) - 但是没有指定它是哪一个。
当您尝试更改子项中的信号处理程序时,会发生什么情况取决于CLONE_SIGHAND
标志。如果没有设置,那么孩子可以愉快地调用sigaction
来改变信号处理程序而不影响父母;但是如果设置了CLONE_SIGHAND
,那么当孩子调用sigaction
时,将为整个过程更改信号处理程序。另请注意,如果您指定CLONE_THREAD
,则还必须指定CLONE_SIGHAND
。
但是,孩子可以使用sigprocmask
屏蔽SIGVTALRM
信号,而不会影响父母。