ターミナルでのCtrl-zとCtrl-cの違いは何ですか?


120

誰でもctrl+ zctrl+の違いを教えてもらえcますか?

私がターミナルにいるとき、両方の組み合わせは現在のプロセスを停止しますが、両者の違いは正確には何ですか?


私はここに非常によく似た質問をしてきました:unix.stackexchange.com/questions/116959/...は
ThorSummoner


はい、両方の違いを理解することに成功しました!!
chaitanyaラクーンディ14

ここで追加したいことの1つは、ほとんどの人(プロのサークルでも)が彼らを区別しないということです。そして、CTRL-Zオプションを使用してコマンドを終了しました。これは間違った習慣です。これらすべてのインスタンスでCTRL-Cを使用する必要があります。CTRL-Zが単にバックグラウンドに置かれるように。そのため、プロセスは完了するまで終了しません。ユーザーが(ほとんどの場合)CTRL-Zを押して終了することは、ユーザーの希望ではありません。
kuldeep.kamboj 14

回答:


156

エッジケースを片側に残す場合、違いは簡単です。Control+ Cながら、ほとんどすぐにアプリケーションを中断Control+ Z懸濁し、バックグラウンドにシャントにそれを。

シェルは、これらの組み合わせで基になるアプリケーションに異なる信号を送信します。

  • Control+ C(制御文字intr)は、アプリケーションを中断するSIGINTを送信します。通常は中止しますが、これは決定するアプリケーション次第です。

  • Control+ Z(制御文字susp)は、SIGTSTPをフォアグラウンドアプリケーションに送信し、事実上バックグラウンドに配置して、中断します。これは、必要なデータを取得するためにエディターのようなものから抜け出す必要がある場合に便利です。実行することでアプリケーションに戻ることができますfg(または%xx示されているジョブ番号はどこにありますかjobs)。

    これをテストするには、実行してnano TESTからControl+ Zを押してから実行しps aux | grep TESTます。これにより、nanoプロセスがまだ実行中であることがわかります。

    oli     3278  0.0  0.0  14492  3160 pts/4    T    13:59   0:00 nano TEST
    

    さらに、(ステータス列にあるTから)プロセスが停止したことがわかります。まだ生きていますが、実行されていません...再開できます。

    一部のアプリケーションは、スリープ中にタイムアウトする可能性のある進行中の外部プロセス(Web要求など)があるとクラッシュします。


51
Ctrlキーを押しながらZキーを押したアプリケーションをフォアグラウンドに戻さに中断を解除するためにbg(の代わりにfg)実行することもできます。アプリケーション起動したときに使用したかのように、アプリケーションを起動したシェルとアプリケーション自体の両方を効果的に制御できます。これを開始するのを忘れたときに便利なことがよくあります:)&&
Malte Skoruppa

6
そして、fgもう一度入力することでそのプロセスに戻ることができます!
sleblanc

4
複数のジョブが中断またはバックグラウンドにある場合:「ジョブ」はそれらをリストし、「fg%n」または「bg%n」または「kill%n」でジョブ%nをフォアグラウンド、バックグラウンド、または強制終了します。
オリビエデュラック

3
@Oli:2番目の段落では、「シェルが基になるアプリケーションにシグナルを送信します…」。オペレーティングシステム/ターミナルドライバーがシグナルを送信します。(ウィンドウシステムでは、ウィンドウマネージャーが役割を果たす場合があります。)また、完了するには(元の質問の範囲を超えていますが)、Ctrl + \を指定することもできます。
スコット14

セッションは、ctrl cまたはを実行した後、どのプロセスグループがフォアグラウンドに戻る必要があるかをどのように知るのctrl zですか?デフォルトはSID(bash)ですか?
ジグガンジャー16

16

Control+ Zプロセスを中断(SIGTSTP)およびControl+ Cプロセスを中断(SIGINT

http://en.wikipedia.org/wiki/Control-Z

Unixライクなシステムでは、Control + Zはプロセスを一時停止するキーシーケンスの最も一般的なデフォルトのキーボードマッピングです。

http://en.wikipedia.org/wiki/Control-C

POSIXシステムでは、シーケンスにより、アクティブなプログラムがSIGINTシグナルを受信します。プログラムがこの状態の処理方法を指定していない場合、プログラムは終了します。通常、SIGINTを処理するプログラムはそれ自体を終了するか、少なくとも内部で実行中のタスクを終了します。


1
良い求人情報の参照。しかし、一般的に言えば、ウィキペディアは技術的な参照のための非常に良い情報源ではありません。
アーロン

3
@ BryceAtNetwork23それは非常に真実です。この場合、ウィキペディアの定義は十分に十分だと感じました。しかし、今後さらに技術的な参考文献を探します!
睡眠不足のフシギダネ

14

Ctrl+ Cは、シグナルSIGINTでプロセスを強制終了するために使用されます。つまり、丁寧な強制終了です。

Ctrl+ Z は、シグナルを送信することによりプロセスを一時停止するために使用されますSIGTSTP。これはスリープシグナルのようなもので、元に戻すことができ、プロセスを再開できます。

ただし、プロセスが中断されるfgと、bg(フォアグラウンドで再開する)および(バックグラウンドで再開する)で再び再開できますが、強制終了されたプロセスを再開することはできません。これはCtrl+ CCtrl+の使用の違いZです。

中断されたプロセスを表示するにはどうすればよいですか?

jobsコマンドは、このような出力が得られます。

[1]-  Stopped                 cat
[2]+  Stopped                 vi

バックグラウンドで一時停止中のプロセスを強制終了する方法は?

killコマンドを使用して:

kill %nここでnjobsコマンドによって表示される番号です。私は猫を殺したいのであれば:kill %1


1
このスレッドの他のコメントに従って、修正:ctrl-zはSIGSTOPではなくSIGTSTPシグナルを送信します。
ルークウェンドリング

%1を強制終了すると、操作が許可されません。なんでそうなの?ありがとう
サティヤプラカシュ

7

簡単に言えば:

  • CTRL-Cプログラムの中止を要求します。

  • CTRL-Zプログラムを強制的に中断し、バックグラウンドにします。

    これにより、後でコマンドを使用して再開できますfg。ログインシェルを終了すると、残りのバックグラウンドタスクは強制終了されます。


5

これは役立つはずです

Ctrl+ Zは、シグナルSIGSTOPを送信してプロセスを中断するために使用されます。シグナルSIGSTOPは、プログラムによってインターセプトできません。一方でCtrl+は、CシグナルSIGINTでプロセスを殺すために使用され、それがすべて終了し、終了する前に自己をクリーンアップ、またはすることはできませんので、プログラムによって傍受することができます。


4
これは完全に正しいわけではありません。SIGTSTPプログラムがキャッチできるを送信します。プログラムを一時停止することができます4つの異なる信号が、ありますSIGSTOPSIGTSTPSIGTTINSIGTTOU。それらのうちのみSIGSTOPをブロックすることはできません。他の3つは、さまざまな条件下でプロセスを停止するために端末によって使用されます。
カスペルド14

4

ctrl+ を押すとc、SIGINTをプロセスに送信することを意味します。次のコマンドを入力するようにkill -SIGINT <your_pid>。それはあなたのプロセスを殺します。そのため、psコマンドを発行しても表示されません。+
を押すと、SIGSTOPをプロセスに送信することを意味します。次のコマンドを入力するように。プロセスは停止しますが、プロセスはまだ生きています。そのため、プロセスにSIGCONTを送信することにより、プロセスを再アクティブ化できます。ctrlzkill -SIGKSTOP <your_pid>

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