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

And*_*rew 7 linux linux-kernel

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

caf*_*caf 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.处理器间中断


Pau*_*bel 5

另一个线程是否仍会安排运行?

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

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

信号手册页中的一条注释:

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

经过一段时间的错误之后,你真的不想做任何其他事情而不是从该程序中解脱出来.