UnixコマンドラインのCtrl + ZとCtrl + Cの違いは何ですか?


189

Mac OS Xターミナルを使用しています。そして、Ctrl+ ZまたはCtrl+ を使用してCいくつかのプログラムを停止します。しかし、私は彼らが正確に何をしているのかわからないことに気付きました。それらは何であり、それらの違いは何ですか?

この質問は今週のスーパーユーザー質問でした。詳細については
、2011年3月13日のブログエントリを参照するか、独自の今週の質問を送信してください

回答:


251

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

プロセスを中断すると、シェルに表示され、中断されたことを通知します。

[1]+  Stopped                 yes

ただし、強制終了すると、シェルプロンプトにドロップされる以外の確認は表示されません。プロセスを中断すると、それを使って派手なこともできます。たとえば、これを実行します:

fg

プログラムを一時停止すると、フォアグラウンドに戻ります。

そして、コマンドを実行する

bg

プログラムを一時停止すると、バックグラウンドで実行できます(ただし、プログラムの出力は引き続きTTYに送られます)。

中断されたプログラムを強制終了する場合、fg最初に戻す必要はありません。次のコマンドを実行するだけです。

kill %1

複数の中断されたコマンドがある場合、実行中

jobs

次のようにそれらをリストします。

[1]-  Stopped                 pianobar
[2]+  Stopped                 yes

使用して%#、ここで、#ジョブ番号(から角括弧内の1つであるjobs出力)でbgfgまたはkill、そのジョブにアクションを実行するために使用することができます。


3
sttyコマンドを使用して、どのキーがどのジョブを実行するかを変更できます。たとえばstty susp ^Z またはstty intr ^C
RedGrittyBrick

7
実際には、傍受可能なSIGTSTPを送信します。
サイモンリヒター

2
クール!プログラムがCtrl + Cで死ぬことを拒否している場合、どうすれば強制的に強制終了できますか?
アディティアMP

2
@adityamenonたとえば、実行可能ファイル名を検索してamarokrun killall amarok、または実行ps aux可能ファイル名の横にあるプロセスIDを実行して検索し、実行しますkill {process id}
ブルーノフィンガー

22

Ctrl + Zは、SIGTSTPを使用してプロセスを中断します。後で再開できます。Ctrl + Cは、SIGINTでプロセスを強制終了します。SIGINTは、ターゲットによって処理/無視されない限りプロセスを終了するため、再開できません。SIGSTOPもあります。SIGSTOPは送信kill()でき、プロセスはインターセプトできません。SIGCONTは、プロセスを一時停止解除するSIGSTOPとSIGTSTPの両方に対応しています。


いいえ、これはSIGSTOPではなくSIGTSTPであり、インターセプトできます。
sch

@sch、それは今正しいですか?
ベンフォークト

はい。ただし、Ctrl-Z(およびCTRL-C)を使用すると、プロセスグループ(端末のフォアグラウンドプロセスグループ)がそのシグナルを受信しますが、必ずしも1つのプロセスだけではありません。また、端末のフォアグラウンドプロセスグループにないプロセスに送信されたSIGTTINおよびSIGTTOUは、端末からの読み取りまたは書き込みを試行するときに送信され、それらも一時停止します。
sch

@sch:プロセスとグループは、信号の送信方法の違いだけではないのですか?IIRCをkill()使用するSIGSTOPと、グループに問題なく送信できます。
ベンフォークト

はい、私のコマンドはCTRL-Zがプロセスを一時停止することに関するものでした...実際にジョブまたはプロセスグループであるときに、1つのプロセスだけに送信されると人々を誤解させる可能性があります。
sch

17

Ctrl + Zは、ジョブを停止(一時停止)します

Ctrl + Cはジョブを終了します

Ctrl + Cではプロセスを再開できませんが、Ctrl + Zではコマンドpromtで入力するだけでジョブを再開できます。

fg %1

複数のプロセスが一時停止している場合は、実行する必要があります

jobs

出力を確認し、適切な番号を選択して再開する

fg %3

リストの3番目のジョブを再開します。また、バックグラウンドでジョブを実行することもできます

bg %n

ここで、nはジョブ番号です。


それは、CTRL-C、CTRL-Z、fg、bgが処理するプロセスではなく、ジョブ(プロセスグループ)です。
sch

3
Cntrl + Z pause the currently running process. 

そして

Cntrl + C simply terminates the running process.

Cntrl + Cを使用すると、プロセスを再開できません。Cntrl + Zを使用すると、プロセスを再開できます。

fg%1を使用してプロセスを再開してください。


3

CTRL+ Zジョブを停止(一時停止)します

CTRL+ Cジョブを終了します

CTRL+ Cあなたがプロセスを再開することはできませんが、とCTRL+ Zジョブはちょうど、コマンドプロンプトで入力して再開することができます。

fg%1

複数のプロセスが一時停止している場合は、実行する必要があります

仕事

出力を確認します。


2

前の答えは正しいですが、何らかの理由でCtrl-Zはすべての子プロセスを一時停止しますが、killall -SIGSTOP ...は最前面の(親)プロセスのみを一時停止し、子供を好きなように実行します。

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