终端中的Ctrl-z和Ctrl-c有什么区别?


120

谁能告诉我ctrl+ zctrl+ 之间的区别c

当我在终端机中时,这两种组合都会停止当前过程,但是两者之间到底有什么区别?


我在这里问了一个非常类似的问题:unix.stackexchange.com/questions/116959/...
ThorSummoner


是的,我成功地理解了两者之间的区别!
chaitanya lakkundi 2014年

我想在这里添加一件事,即大多数人(在我的职业圈子中)也不区分他们。并使用CTRL-Z选项终止命令。这是错误的做法。您必须在所有这些实例上使用CTRL-C。正如CTRL-Z只是放在后台。因此过程直到完成才终止,这可能不是用户(大部分时间)按CTRL-Z终止时所希望的。
kuldeep.kamboj 2014年

Answers:


155

如果我们将边缘情况留在一侧,则区别很简单。Control+ C几乎立即中止应用程序,而Control+将其Z分流到后台并挂起。

Shell通过这些组合向基础应用程序发送不同的信号:

  • Control+ C(控制字符intr)发送SIGINT,它将中断应用程序。通常导致它中止,但这取决于应用程序来决定。

  • Control+ Z(控制字符susp)将SIGTSTP发送到前台应用程序,将其有效地置于后台并挂起。如果您需要突破诸如编辑器之类的功能来获取所需的数据,这将很有用。您可以通过运行返回到应用程序fg(或%x其中x是如图所示的作业号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
值得补充的是,还可以运行bg(而不是fg)以取消挂起Ctrl + Z的应用程序而不将其放回前台。可以有效地控制启动应用程序的外壳应用程序本身,就像&启动应用程序时一样。当您忘记以&:: 开头时,这通常会派上用场
Malte Skoruppa 2014年

6
您可以fg再次输入以返回该过程!
sleblanc

4
如果有几项作业被暂停或在后台运行:“作业”列出它们,然后使用“ fg%n”或“ bg%n”甚至“杀死%n”将作业%n置于前景,后台或将其杀死。
奥利维尔·杜拉克

3
@Oli:您的第二段说,“外壳程序将信号发送给底层应用程序……。”不,操作系统/终端驱动程序发送信号。(在窗口系统中,窗口管理器可能会起作用。)此外,为了完整起见(尽管超出了原始问题的范围),您可能需要提及Ctrl + \。
斯科特

会话在执行ctrl c或操作后如何知道哪个进程组必须返回到前台ctrl z?它默认为SID(bash)吗?
jiggunjer '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
干得好发布参考。但总的来说,维基百科不是很好的技术参考资料来源。
亚伦2014年

3
@ BryceAtNetwork23是非常正确的;在这种情况下,我觉得Wikipedia的定义已经足够了。我将来会寻找更多技术参考!
睡眠剥夺了Bulbasaur,2014年

13

Ctrl+ C用于杀死带有信号的进程,SIGINT换句话说,这是礼貌的杀死

Ctrl+ Z 用于通过向其发送信号SIGTSTP(例如休眠信号)来暂停该过程,该信号可以撤消,并且可以重新开始该过程。

但是,当一个进程被挂起时,我们可以通过fg(在前台恢复)和bg(在后台恢复)再次恢复它,但是我无法恢复被终止的进程,这是使用Ctrl+ CCtrl+ 的区别Z

我们如何查看暂停的流程?

jobs命令给出如下输出:

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

如何在后台杀死暂停的进程?

通过使用kill命令:

kill %nnjobs命令显示的数字在哪里。所以,如果我想杀死猫:kill %1


1
根据该线程中的其他注释,更正:ctrl-z发送SIGTSTP信号而不是SIGSTOP。
lukewendling

杀死%1告诉我-不允许进行操作。为什么这样?谢谢
萨蒂亚·普拉卡什

7

简而言之:

  • CTRL-C请求程序中止

  • CTRL-Z强制程序挂起并进入后台

    这使您可以稍后使用命令恢复它fg。当您退出登录外壳程序时,剩余的后台任务将被杀死。


5

应该有帮助

Ctrl+ Z用于通过向其发送信号SIGSTOP来挂起进程,该信号无法被程序拦截。而Ctrl+ C用于杀死带有SIGINT信号的进程,并且可以被程序拦截,因此它可以在退出之前清理自身或完全退出。


4
这并不完全正确。它发送SIGTSTP,可以被程序捕获。有四种不同的信号,它可以中断程序SIGSTOPSIGTSTPSIGTTINSIGTTOU。其中只有SIGSTOP不能被阻止。终端使用其他三个在不同条件下停止该过程。
kasperd 2014年

4

当您按ctrl+时c,表示您将SIGINT发送到您的进程。就像您键入以下命令一样:kill -SIGINT <your_pid>。它将杀死您的过程。那就是为什么在发出ps命令时看不到它的原因。
当您按ctrl+时z,表示您将SIGSTOP发送到您的进程。就像您键入以下命令一样:kill -SIGKSTOP <your_pid>。它将停止您的过程,但是该过程仍然有效。因此,您可以通过将SIGCONT发送给您的流程来重新激活您的流程。

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.