1

我做了以下事情:

  1. 创建一个重复触发的虚拟计时器。
  2. 为 SIGVTALRM 安装信号处理程序
  3. 调用克隆系统调用
  4. 设置 sched_affinity 以便克隆的线程在不同的 CPU 上运行

克隆的线程也会监听 SIGVTALRM 吗?那么当 SIGVTALRM 被触发时,两个线程都会调用信号处理程序吗?此外,在创建新线程后,我可以将其用于 SIGVTALRM 的信号处理程序更改为另一个函数而不影响主线程信号处理程序吗?

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

4

1 回答 1

1

这完全取决于您是否指定CLONE_THREAD克隆系统调用。如果你不这样做那么定时器就不会被孩子继承(所以定时器到期时不会发出信号)。它仍然会安装一个信号处理程序。

如果您指定CLONE_THREAD则认为子进程与父进程属于同一进程。当计时器到期时,将向其中一个线程发出信号(并运行信号处理程序) - 但没有指定哪个线程。

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

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

于 2010-01-27T23:56:53.743 回答