2016-12-26 703 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