システムコール中にプロセスを終了できますか?

システムコール中にプロセスを終了できますか?

現在、ユーザースペースプロセスのコンテキストでカーネルモードで実行されている非常に時間がかかるシステムコールがあるとします。これらのシステムコールが実行されている間、システムコールはユーザープロセスSIGKILLに送信されます。この場合、何が起こりますか?プロセスはすぐに終了するか、システムコールが終了するのを待ちますか?プロセスが即座に終了すると、割り込みハンドラの実行中にユーザースペースプロセスが終了した場合にも同じように適用されます(割り込みハンドラは任意のユーザースペースプロセスのコンテキストで実行される可能性があるため)奇妙に聞こえますが、非常に重要です。割り込みハンドラの操作が中断される可能性があります。

答え1

一部のシステムコールは中断されることがあります(例を参照siginterrupt(3))。それ以外の場合は、呼び出しがユーザーモードに戻ったときにのみ信号が転送されます。

答え2

非常に時間がかかるシステムコールの例はですpause()。プロセスが信号を受信しない場合は完了しません。

read()シリアルラインから読み取るときなど、中断可能(より良い用語は「シグナリング可能」)またはブロックデバイスから読み取るときなど、中断できません。

なぜ?元のUNIXロジックは次のとおりです。シリアルラインで入力が利用可能かどうかはわかりません。したがって、何も入力しなくてもシステムコールを終了する方法が必要です。一方、ブロックデバイスからの読み出しは常に完了しますが、ディスクに障害が発生するとエラーが発生する可能性があります。

Unixはたくさん進歩しました。今日、無中断read()は可能ですが、決して完全ではありません。例:NFSサーバーがダウンしてマウントされたときにNFSマウントファイルシステムから読み取られますhard

答え3

実際の割り込みハンドラはカーネルにあり、ユーザープロセスと実際の関連付けはありません。シグナルハンドラは、ユーザプロセスが割り込みハンドラに最も近いものです。一部の信号は信号処理中にブロックされますが、SIGKILLはそのうちの1つではないため、他のユーザーコードと同様にすぐに終了します。

答え4

シグナル(通常はプロセスコンテキストを復元する特権アセンブリ命令)は、実行がユーザーモードに戻り(カーネルモードの終了など)、プロセスが実行されるようにスケジュールされている場合にのみ渡すことができ、ユーザーモードを設定または設定しません。かもしれません。プロセスがシステムコールにある場合) - これは、システムコールが返されたとき、または割り込みハンドラが返されたときです。

特定の質問に答えるためにシステムコールが終了するのを待ち(割り込みまたはそうでない場合があります)、割り込みハンドラがプロセスに返された場合(つまり、カーネルモードに戻る)ユーザーモードではない場合、プロセスはシステムコールで後で返されるまで(つまり、ユーザーモードで返されるまで)シグナルは転送されません。

システムコールが中断され(EINTRが返され)、「再起動可能」の場合、シグナルハンドラが実行された後にシステムコールインターフェイスをサポートするユーザーコードは、ユーザーコードに戻ることなくシステムコールを自動的に再入力することを選択できます。

また確認これ出て...

最後に、ここで意味するのは、プロセスがシステムコールから決して返されない場合(結果的に「終了できない」プロセスが発生した場合)、SIGKILLを含む信号がプロセスに転送されないことです。

関連情報