And*_*rew 7 linux linux-kernel
如果你有一个多线程程序(Linux 2.26内核),并且一个线程做了导致段错误的东西,其他线程是否仍会安排运行?其他线程是如何终止的?有人可以解释多线程程序的进程关闭程序吗?
当致命信号传递给线程时,调用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上执行).
另一个线程是否仍会安排运行?
不.SEGV是一个流程级问题.除非你已经处理了SEGV(这几乎总是一个坏主意),否则你的整个过程将会退出,并且所有线程都将退出.
我怀疑其他线程处理得不是很好.如果处理程序调用exit()或_exit(),则不会调用线程清理处理程序.如果您的程序严重损坏,这可能是一件好事,在seg故障之后很难相信任何事情.
信号手册页中的一条注释:
根据POSIX,在忽略不是由kill(2)或raise(3)函数生成的SIGFPE,SIGILL或SIGSEGV信号之后,进程的行为是未定义的.
经过一段时间的错误之后,你真的不想做任何其他事情而不是从该程序中解脱出来.