如何在linux崩溃期间终止线程?

时间:2010-08-27 20:19:57

标签: linux linux-kernel

如果你有一个多线程程序(Linux 2.26内核),并且一个线程做了导致段错误的东西,其他线程是否仍会安排运行?其他线程是如何终止的?有人可以解释多线程程序的进程关闭程序吗?

2 个答案:

答案 0 :(得分:7)

当致命信号传递给线程时,调用do_coredump()do_group_exit()函数。 do_group_exit()设置线程组退出代码,然后在退出zap_other_threads()线程之前通知线程组中的所有其他线程以current退出。 (do_coredump()调用coredump_wait()同样调用zap_threads())。

zap_other_threads()为线程组中的每个其他线程发布SIGKILL,并使用signal_wake_up()将其唤醒。 signal_wake_up()调用kick_process(),它将引导线程进入内核模式,以便它可以在必要时使用IPI 1 来接收信号(例如,如果它在另一个CPU上执行) )。

<小时/> 1。处理器间中断

答案 1 :(得分:5)

其他线程是否仍计划运行?

没有。 SEGV是一个流程级问题。除非你已经处理了SEGV(这几乎总是一个坏主意),否则你的整个过程将会退出,并且所有线程都将退出。

我怀疑其他线程处理得不是很好。如果处理程序调用exit()或_exit(),则不会调用线程清理处理程序。如果您的程序严重损坏,这可能是一件好事,在seg故障之后很难相信任何事情。

signal手册页中的一条注释:

  

根据POSIX,在忽略不是由kill(2)或raise(3)函数生成的SIGFPE,SIGILL或SIGSEGV信号之后,进程的行为是未定义的。

经过段错误之后,你真的不想做任何其他事情,除了搞定那个程序。