Ctrl C与Ctrl Z与前景工作


26

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 &

4
“另一种方式更有意义吗?” 您能说明为什么会这样吗?
glglgl 2014年

Answers:


55

我认为您可能对工作控制符号感到困惑。值得注意的是,“已停止”表示作业仍在运行,但是它具有处理任何事物的能力(在CPU上没有任何时间可以处理任何事情)。这实际上是“暂停”或“已暂停”状态,尽管这不是正确的技术术语。

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

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


我仍然认为Ctrl + Z将发送SIGKILL,而Ctrl + C将发送SIGINIT。因此,Ctrl + Z也会终止工作。但是从我的示例来看,Ctrl + Z仅像您说的那样停止作业。所以这让我有些困惑。
neo0 2014年

10
@ neo0-也许​​您已经习惯了一些怪异的自定义设置?您可以配置这些内容-尽管如果您有依赖于这些地图的应用程序,则可能不应该配置。但是默认配置是CTRL+C=SIGINTCTRL+Z=SIGTSTP
mikeserv

3
卡列布(Caleb)是对的(+1)。ctrl-Z会停止该程序,您应将其视为“冻结”该程序,但该程序仍在内存中,正在打开文件等。该程序不会被杀死/终止。
Olivier Dulac 2014年

“挂起”可能比“停止”更清晰。
罗素·博罗戈夫

1
@jiggunjer这就是事物的形状。该答案提供了一些背景,说明为什么需要执行两个步骤,并且步骤介绍了一些使这些步骤更轻松的功能。
卡列布
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.