2016-12-26 705 views
2

我有一个2线程的程序。一个线程中的崩溃如何影响其他线程。

  • 线程1:在IOCTL调用(带司机交互)
  • 线程2:做其他的东西在那里SIGSEGV来了。

在这种情况下,Thread1完成ioctl调用的执行还是线程在执行内核代码之间停止?

如果可能,请在Windows,Linux和Android上下文中提供答案(其中debuggerd附加到使用ptrace创建墓碑的进程)。

+0

请详细说明您自己调查此过程的步骤。 –

回答

1

对于Linux的回答:我假设进程将作为处理SIGSEGV的线程2的一部分而终止。在Linux中,虽然系统调用代码可能(例如,如果它处于所谓的可中断等待中)通知进程终止并提前退出,但线程在它处于内核模式时通常不能终止。线程1一旦返回就会终止。

从开发的角度来看,我并不熟悉Android,但我的理解是,进程为许多信号唤醒debuggerd守护进程,然后通过ptrace和dump来连接处理信号的进程过程状态的各种位。我希望这可以在线程1从系统调用返回之前发生。

+0

感谢您花时间回答此问题。你可以提供任何引用_“线程不能正常终止,因为它是在内核模式下”_ –

+0

如果正在执行的内核代码显式终止线程(例如,_exit系统调用)或另一个内核线程那么做当然,线程可以在内核模式下终止。否则:我没有很好的引用来提供,但看看kernel/exit.c和kernel/thread.c,特别是do_group_exit(),它是“被致命信号调用”的。这向组中的所有线程发送终止信号,并且信号在用户模式下处理(例如,在完成系统调用之后)而不是处于内核模式。可中断睡眠中的线程被唤醒。 – michaeljt