巨大なファイルを読み始めてしばらくしてから終了したいことがよくありますが、
Ctrl+ Cを押してからプログラムが停止するまでに時間がかかります。Ctrl+ Cキーを数回押すことで遅延を短縮する可能性はありますか?それとも、キープレスを無駄にしていますか?
^C
、プレスを登録するとシェルが印刷されます(少なくともbashはそうです)
巨大なファイルを読み始めてしばらくしてから終了したいことがよくありますが、
Ctrl+ Cを押してからプログラムが停止するまでに時間がかかります。Ctrl+ Cキーを数回押すことで遅延を短縮する可能性はありますか?それとも、キープレスを無駄にしていますか?
^C
、プレスを登録するとシェルが印刷されます(少なくともbashはそうです)
回答:
最初の後Ctrl-C、プログラムが送信されますSIGINT
と通常(など、ソケットを閉じ、TMPファイルを削除する)クリーンアップを開始します。Ctrl-Cそれが進行中にもう一度ヒットすると、クリーンアップルーチンを中断する可能性があります(つまり、追加の信号がそのまま残される代わりに処理される場合があります)。これは通常そうではありませんが、より一般的には、追加の信号は実際に後に送信されますプロセスが終了しました(オペレーターとシステムとの相互作用に固有の遅延があるため)。つまり、信号は別のプロセス(多くの場合、シェルですが、常にではない)で受信されます。その受信者がこの信号を適切に処理しない場合(シェルが通常行うように-ジェニーDの答えを参照)、そのようなアクションの結果に不愉快に驚くかもしれません。
INT
は、プロセスが受信する別の信号です。
trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10
ます。スクリプトを実行し、ctrl-Cを2回押します。2番目のctrl-Cが(トラップステートメント内の)「クリーンアップ」ルーチンに渡され、そのsleep
コマンドが終了することがわかります。
trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10
はsleep
コマンドだけです。二人とも間違ったxD
isig
オンの場合、CTRL-Cが押されてカーネルによって受信されるとすぐに(端末エミュレーターの場合、端末エミュレーターが疑似端末のマスター側に書き込むとすぐに)、SIGINTシグナルがすべての端末のフォアグラウンドプロセスグループのプロセス。そこでブロックされる場合がありますが、後で別のプロセスに配信されることはありません。端末デバイスのバッファーがいっぱいであっても(アプリケーションが入力したものを読み取っていない場合でも)、CTRL-Cはキューをジャンプします。
あなたはそれらを無駄にしている。発生することは、サーバーが画面出力を終了すると、複数のを受信することCtrl-Cです。最初のものはプロセスを強制終了するために使用され、次のものはシェルで終了します。シェルは次のようになります
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$
短い答え:プロセスがそれに反応する場合。
長い答え:ctrl+を押すとc、カーネルはプロセスにシグナルを送信します。次のコマンドにより、どの信号を判別できます。
user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
のmanページを参照してくださいstty
。
intr CHAR
CHAR will send an interrupt signal
これはINT
、番号2とも呼ばれるシグナルです。プロセスにシグナルハンドラがある場合、これに対応できます。ほとんどのプロセスは、クリーンアップジョブを実行して正常に終了します。
kernel
ターミナルのフォアグラウンドプロセスグループ内のすべてのプロセスにSIGINTを送信するのは(ターミナルのラインディシプリン、ターミナルドライバ)です。
Ctrl-C一般的な場合に必要なのは1つだけですが、必要になる場合があります。たとえば、Python Ctrl-Cは新しいスレッドが生成されたときにトラップするため、多くのスレッドを起動している最中に何か問題が発生した場合、複数回再送信してpython
親プロセスに到達する必要があります。捕まった。
私はいつもCtrlc複数回押す必要があります。最初のプレスでそれを反応させたことがなく、システムが実際Ctrlcに送信されていることを認識するまで何度も使用しなければなりません。それは実際にそれらのほとんどを逃す/失うかのようです。
bash
、zsh
常に親を閉じる場合には当てはまりません。それが私が好きな理由の1つですzsh
。