ctrl-cを数回押すと、実行中のプログラムがより速く閉じられますか?


41

巨大なファイルを読み始めてしばらくしてから終了したいことがよくありますが、
Ctrl+ Cを押してからプログラムが停止するまでに時間がかかります。Ctrl+ Cキーを数回押すことで遅延を短縮する可能性はありますか?それとも、キープレスを無駄にしていますか?


さまざまな子プロセスを呼び出すプロセスを実行すると、Ctrl-Cが実行中の子を中断することがありますが、親プロセスは中断しないことがあります。これはに当てはまりますがbashzsh常に親を閉じる場合には当てはまりません。それが私が好きな理由の1つですzsh
joeytwiddle

17
はい。エレベータボタンまたは横断歩道ボタンを繰り返し押すと、エレベータがすぐに来たり、ライトがより速く緑に変わります。
マイケル14年

3
はい、エレベータや横断歩道のボタンと同じように、CTRL-Cは粘着性や錆びたり、不明瞭な接続を発生させたりする可能性があります。1回押すだけでエレベーターの到着、歩行標識の点灯、またはプログラムの終了が登録されるため、より多くの回数押すことは良い戦術です。
ヒッピートレール14年

1
@hippietrailが^C、プレスを登録するとシェルが印刷されます(少なくともbashはそうです)
wchargin 14年

1
それが価値があることについては、キープレスを無駄にすることは考えていません。(私は通常2〜3回、それを打つが、私はあなたが常にマシンに達するごとに1回のキーストロークに数えることができなかった電話回線で接続された端末「で育った」ので、それは部分的にです。)
keshlam

回答:


35

最初の後Ctrl-C、プログラムが送信されますSIGINTと通常(など、ソケットを閉じ、TMPファイルを削除する)クリーンアップを開始します。Ctrl-Cそれが進行中にもう一度ヒットすると、クリーンアップルーチンを中断する可能性があります(つまり、追加の信号そのまま残される代わりに処理される場合があります)。これは通常そうではありませんが、より一般的には、追加の信号は実際に後に送信されますプロセスが終了しました(オペレーターとシステムとの相互作用に固有の遅延があるため)。つまり、信号は別のプロセス(多くの場合、シェルですが、常にではない)で受信されます。その受信者がこの信号を適切に処理しない場合(シェルが通常行うように-ジェニーDの答えを参照)、そのようなアクションの結果に不愉快に驚くかもしれません。


クリーンアップルーチンを中断する必要があるのはなぜですか?これINTは、プロセスが受信する別の信号です。
カオス14年

4
@chaosなぜそれが必要なのですか?クリーンアップルーチンがハングアップし、それを停止する場合は、する必要があります。実際にこのように機能しますか?はい、かなり頻繁に。簡単に説明できます。1行でbashスクリプトを作成しtrap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10ます。スクリプトを実行し、ctrl-Cを2回押します。2番目のctrl-Cが(トラップステートメント内の)「クリーンアップ」ルーチンに渡され、そのsleepコマンドが終了することがわかります。
John1024 14年

1
@ John1024ああ、今は見えます。スクリプトスニペットに感謝します^^ただし、クリーンアップはキャンセルされません:シグナルを取得するのtrap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10sleepコマンドだけです。二人とも間違ったxD
カオス14年

2
それは間違っています。シグナル配信は同期的です。isigオンの場合、CTRL-Cが押されてカーネルによって受信されるとすぐに(端末エミュレーターの場合、端末エミュレーターが疑似端末のマスター側に書き込むとすぐに)、SIGINTシグナルがすべての端末のフォアグラウンドプロセスグループのプロセス。そこでブロックされる場合がありますが、後で別のプロセスに配信されることはありません。端末デバイスのバッファーがいっぱいであっても(アプリケーションが入力したものを読み取っていない場合でも)、CTRL-Cはキューをジャンプします。
ステファンシャゼル14年

1
はい、一例として、VLCは複数のCtrl + Cシグナルをクリーンに終了する方法として解釈しますが、単一のCtrl + Cはクリーンに終了しようとします。
ジェレミーフィッサー14年

11

あなたはそれらを無駄にしている。発生することは、サーバーが画面出力を終了すると、複数のを受信することCtrl-Cです。最初のものはプロセスを強制終了するために使用され、次のものはシェルで終了します。シェルは次のようになります

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 

6
プロセスは、SIGINTを送信するときに必ずしも終了するわけではありません。それは無期限に生き続けることができ、Ctrl + Cを押すたびに異なることを行うことができます。
ブライアンゴードン14年

本当です。私は、ユーザーがどのようにファイルを読んでいるかについて推測していました。
ジェニーD 14年

5

短い答え:プロセスがそれに反応する場合。

長い答え: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とも呼ばれるシグナルです。プロセスにシグナルハンドラがある場合、これに対応できます。ほとんどのプロセスは、クリーンアップジョブを実行して正常に終了します。


Ctrl-Zは通常、処理可能なSIGTSTPを送信します(SIGSTOPとは異なります)。
ペテルフ14年

4
いいえ、SIGINTをプロセスに送信するのはシェルではありません。kernelターミナルのフォアグラウンドプロセスグループ内のすべてのプロセスにSIGINTを送信するのは(ターミナルのラインディシプリン、ターミナルドライバ)です。
ステファンシャゼル14年

将来の読者は、unix.stackexchange.com / a / 120071/135943も参照してください。
ワイルドカード

4

あなたが正しい。キー押下が無駄になっています。を押しCrtl+Cて検出されると、クリアする必要があるリソースがあるため、時間がかかります。押すことCtrl+Cが必要な場合、私が知っている可能性のある1つのケースは、Yumの更新プロセスをキャンセルする場合ですCtrl+C


2

Ctrl-C一般的な場合に必要なのは1つだけですが、必要になる場合があります。たとえば、Python Ctrl-Cは新しいスレッドが生成されたときにトラップするため、多くのスレッドを起動している最中に何か問題が発生した場合、複数回再送信してpython親プロセスに到達する必要があります。捕まった。


1
これは、マルチスレッド/処理されたpythonスクリプトを作成するときに時々起こります。メインプロセスが終了する前に、いくつかのプレスが必要になる場合があります。
レオ14年

0

私はいつもCtrlc複数回押す必要があります。最初のプレスでそれを反応させたことがなく、システムが実際Ctrlcに送信されていることを認識するまで何度も使用しなければなりません。それは実際にそれらのほとんどを逃す/失うかのようです。

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