ctrl c 与 ctrl z 与前台作业

neo*_*eo0 31 shell bash signals job-control

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 &
Run Code Online (Sandbox Code Playgroud)

Cal*_*leb 64

我认为您可能对作业控制符号感到困惑。值得注意的是“停止”意味着作业仍然存在,但它处理任何事情的能力已经被保留(CPU 没有任何时间来处理任何事情)。这实际上是“暂停”或“暂停”状态,尽管这不是正确的技术术语。

  • CtrlC不会“停止”工作,它会取消或杀死它。从技术上讲,它会导致向程序发送一个中断信号,告诉它中止正在执行的操作并立即退出。有些程序会听到这个信号,并在退出之前对自己做一些紧急清理工作。其他人不会响应该信号并随后被中止。

  • CtrlZ,另一方面,“停止”工作。同样,这是通过信号完成的,但这次是“停止”而不是“中断”信号。这有效地将其搁置并将控制权返回给 shell,但实际上并不会终止该作业。如果您希望这样的作业继续运行,则可以发出bg命令将上次停止的作业发送到后台。然后它将继续作为后台作业运行,就像您首先运行它一样&。您还可以使用fg在前台恢复上次停止的作业(允许它从停止的地方继续,并允许您再次与其交互)。

  • @neo0 - 也许你习惯了一些奇怪的自定义设置?您可以配置这些东西 - 尽管您可能不应该配置依赖于这些地图的应用程序。但是默认配置是`CTRL+C=SIGINT`和`CTRL+Z=SIGTSTP`。 (11认同)
  • 迦勒是对的(+1)。ctrl-Z 停止程序,您应该将其视为“冻结”它,但该程序仍在内存中,它的文件已打开等。它不会被终止/终止。 (3认同)