2

私は2つのスレッドを持つプログラムを持っています。あるスレッドのクラッシュが他のスレッドにどのような影響を与えるか。

  • スレッド1:IOCTLでコール(ドライバーとの相互作用)
  • スレッド2:SIGSEGVが来た他のものを行います。

この場合、スレッド1はioctl呼び出しの実行を完了するか、スレッドは実行中のカーネルコードの間で停止しますか?

可能であれば、Windows、Linux、およびAndroidのコンテキスト(debuggerdがptraceを使用して墓石を作成するプロセス)で回答を提供してください。

+0

これを自分で調べるために行った手順を詳しく説明してください。 –

答えて

1

答え:Linuxの場合:プロセスはスレッド2の一部としてSIGSEGVを処理すると仮定しています。 Linuxでは、スレッドがカーネルモードの間にスレッドを正常に終了することはできませんが、システムコールコードでは(たとえば、割り込み可能な待機状態にある場合など)、プロセスが終了して早期に終了することがあります。スレッド1は、戻ったら終了します。

私は開発の観点からはAndroidに精通していませんが、プロセスはdebuggerdデーモンを起動するいくつかのシグナルのハンドラを設定し、シグナルを処理するプロセスに接続しますプロセス状態の様々なビット。スレッド1がシステムコールから復帰する前にこれが起こることが期待されます。

+0

これに答える時間をとってくれてありがとう。 _ –

+0

実行中のカーネルコードがスレッド(例:_exitシステムコール)を終了した場合、または他のカーネルスレッドがそれを実行した場合は、コースはカーネルモードで終了できます。そうでなければ:私は提供する良い引用を持っていないが、kernel/exit.cとkernel/thread.c、特に "致命的なシグナルによって呼び出される" do_group_exit()を見てください。これにより、グループ内のすべてのスレッドにkillシグナルが送信され、シグナルはカーネルモードではなく、ユーザーモード(システムコールの終了後など)で処理されます。中断可能なスリープ中のスレッドが起動します。 – michaeljt

関連する問題