如果你有一个多线程程序(Linux 2.26内核),并且一个线程做了导致段错误的东西,其他线程是否仍会安排运行?其他线程是如何终止的?有人可以解释多线程程序的进程关闭程序吗?
答案 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信号之后,进程的行为是未定义的。
经过段错误之后,你真的不想做任何其他事情,除了搞定那个程序。