克隆线程上的Linux虚拟计时器行为

时间:2010-01-27 15:31:32

标签: linux timer system-calls

我做了以下事情:

  1. 创建一个反复触发的虚拟计时器。
  2. 安装SIGVTALRM的信号处理程序
  3. 调用克隆系统调用
  4. 设置sched_affinity以使克隆的线程在不同的CPU上运行
  5. 克隆线程是否也在监听SIGVTALRM?那么当SIGVTALRM被触发时,两个线程都会调用信号处理程序吗?另外,在创建新线程之后,我可以将SIGVTALRM的signalhandler更改为另一个函数而不影响主线程signalhandler吗?

    我猜这取决于传递给clone()的标志。主要是,我正在使用CLONE_SIGHAND和SIGCHLD。它也依赖于其他标志吗?

1 个答案:

答案 0 :(得分:1)

这完全取决于您是否为克隆系统调用指定了CLONE_THREAD。如果您执行,则子项不会继承itimer(因此在计时器到期时不会发出信号)。它仍然会安装一个信号处理程序。

如果您执行指定CLONE_THREAD,则该子项被视为属于与父项相同的进程。当计时器到期时,一个线程将被发出信号(并运行信号处理程序) - 但是没有指定它是哪一个。

当您尝试更改子项中的信号处理程序时,会发生什么情况取决于CLONE_SIGHAND标志。如果没有设置,那么孩子可以愉快地调用sigaction来改变信号处理程序而不影响父母;但是如果设置了CLONE_SIGHAND,那么当孩子调用sigaction时,将为整个过程更改信号处理程序。另请注意,如果您指定CLONE_THREAD,则还必须指定CLONE_SIGHAND

但是,孩子可以使用sigprocmask屏蔽SIGVTALRM信号,而不会影响父母。