LinuxでCtrl + cを2回入力すると実行中のプロセスが停止するのはなぜですか?


24

vlcなどのLinuxプログラムがあります。これは、プログラムが最初のプログラムの後に停止しなかった場合に、ターミナルからの実行を強制終了するためにctrl+をc2回入力することを推奨します。

初回が機能しなかったのに、ctrl+をc2回入力しても機能したのはなぜですか?


回答:


35

それが行うことは完全にアプリケーション固有です。ctrl+ を押すcと、ターミナルエミュレータはフォアグラウンドアプリケーションにSIGINTシグナルを送信し、適切な「シグナルハンドラ」をトリガーします。SIGINTのデフォルトのシグナルハンドラは、アプリケーションを終了します。ただし、どのプログラムでも、SIGINT用の独自のシグナルハンドラー(実行をまったく停止しないシグナルハンドラーを含む)をインストールできます。

どうやら、vlcは最初に呼び出されたときに何らかのクリーンアップ/グレースフル終了を試みるシグナルハンドラをインストールし、2回目に呼び出されたときに即座に実行を終了するデフォルトの動作にフォールバックします。


3
一部のシステムでは、ハンドラーの呼び出し後にシグナルがSIG_DFLに戻されます(同じシグナルでハンドラーを2回呼び出さないようにするため)。これはSysVセマンティクスと呼ばれます。多くのプログラムは、シグナルハンドラーをハンドラーの最後の元のプログラム上の設定に戻しません。これは通常、プログラミングのバグです。詳細についてお読み信号(2)manページを
アルケージュ

16

Ctrl+ によって送信されるシグナルであるSIGINTC、通常、プログラムにメインコマンド処理ループにブレークアウトするか、それが意味をなさない場合は正常に終了するように指示します。一部のプログラムは、SIGINTを受け取ったときにクリーンアップ手順を実行します。プログラムがめちゃくちゃになり、クリーンアップ手順が失敗する場合、一部のプログラムでは、2番目のCtrl+ Cによりプログラムが直ちに終了します。これを行うことは、各プログラムの作成者次第です。

第二場合はCtrl+は、Cプログラム、試して殺さないCtrl+ \送り、SIGQUIT、より暴力的な(しかしまだ捕捉可能な信号)、またはしようとCtrl+ Zして中断プログラムして、killコマンド(例えばkill %1送信SIGTERMを、従来より少ない暴力的な信号をSIGQUITよりも、ジョブ番号1)。他のすべてが失敗した場合はkill -KILL、とも呼ばれkill -9、キャッチできないシグナルSIGKILLを送信してプログラムを強制終了します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.