web-dev-qa-db-ja.com

フォアグラウンドジョブでのctrl cとctrl z

Ctrl+Z 仕事を止める Ctrl+C 仕事を殺します。

何故ですか?他の方法の方が意味をなさないでしょうか?

z@z-lap:~$ sleep 100&
[1] 4458
z@z-lap:~$ sleep 200&
[2] 4459
z@z-lap:~$ jobs
[1]-  Running                 sleep 100 &
[2]+  Running                 sleep 200 &
z@z-lap:~$ fg %1
sleep 100
^Z
[1]+  Stopped                 sleep 100
z@z-lap:~$ jobs
[1]+  Stopped                 sleep 100
[2]-  Running                 sleep 200 &
z@z-lap:~$ fg %1
sleep 100
^C
z@z-lap:~$ jobs
[2]+  Running                 sleep 200 &
26
neo0

ジョブコントロールの表記について混乱していると思います。特に「停止」とは、ジョブはまだ存続しているが、何かを処理する機能が保持されていることを意味します(CPUで何かを処理する時間は与えられません)。これは事実上「一時停止」または「一時停止」状態ですが、これは正しい技術用語ではありません。

  • CtrlC ジョブを「停止」するのではなく、ジョブをキャンセルまたは強制終了します。技術的には、割り込み信号がプログラムに送信され、実行中の処理を中止してすぐに終了するように指示します。一部のプログラムは、この信号を聞いて、終了する前に緊急クリーンアップ作業を行います。他のユーザーは信号に応答せず、ただ単に中止されます。

  • CtrlZ一方、ジョブを「停止」します。これも信号で行われますが、今回は「割り込み」信号ではなく「停止」です。これは事実上それを保留にして制御をシェルに戻しますが、実際にはジョブを強制終了しません。そのようなジョブを継続して実行したい場合は、bgコマンドを発行して、最後に停止したジョブをバックグラウンドに送信できます。そもそも&で実行したかのように、バックグラウンドジョブとして実行を続けます。 fgを使用して、最後に停止したジョブをフォアグラウンドで再開することもできます(中断したところから続行できるようにして、もう一度やり取りできるようにします)。

55
Caleb