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

cha*_*ndi 145 command-line

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

当我在终端时,这两种组合都会停止当前进程,但两者之间究竟有什么区别?

Oli*_*Oli 182

如果我们将边缘情况放在一边,区别很简单。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
    
    Run Code Online (Sandbox Code Playgroud)

    此外,我们可以看到(从状态列中的那个 T)进程已停止。所以它仍然活着,但它没有运行......它可以恢复。

    如果某些应用程序有正在进行的外部进程(如 Web 请求),而这些进程可能会在它们休眠时超时,则它们会崩溃。

  • 值得补充的是,也可以运行`bg`(而不是`fg`)来取消挂起已被Ctrl+Z'ed *而没有* 将其放回前台的应用程序;有效地让您控制启动应用程序的外壳程序 * 和应用程序本身,就好像您在启动应用程序时使用了 `&` 一样。当您忘记以 `&` 开头时,这通常会派上用场:) (58认同)
  • 你可以通过再次输入`fg`来回到那个过程! (9认同)
  • 如果有多个作业暂停或在后台:“jobs”列出它们,然后“fg %n”或“bg %n”甚至“kill %n”将作业 %n 放在前台、后台或杀死它. (4认同)
  • @Oli:你的第二段说,“shell 向底层应用程序发送 [s] ......信号......”。不,操作系统/终端驱动程序发送信号。(在窗口系统中,窗口管理器可能会起作用。)另外,为了完整(虽然超出了原始问题的范围),您可能想要提及 Ctrl+\。 (3认同)

nux*_*nux 21

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

Ctrl+Z 用于通过向进程发送信号来暂停进程SIGTSTP,这类似于睡眠信号,可以撤消并且进程可以再次恢复。

但是,当一个进程被挂起时,我们可以通过fg(resume in foreground) 和bg(resume in background)再次恢复它,但我无法恢复被杀死的进程,这是使用Ctrl+ C& Ctrl+的区别Z

我们如何查看挂起的进程?

jobs命令给出如下输出:

[1]-  Stopped                 cat
[2]+  Stopped                 vi
Run Code Online (Sandbox Code Playgroud)

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

通过使用kill命令:

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

  • 根据此线程中的其他评论,更正:ctrl-z 发送 SIGTSTP 信号而不是 SIGSTOP。 (2认同)

Sle*_*aur 18

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 的程序仍会自行终止,或者至少终止在其中运行的任务

  • @BryceAtNetwork23 非常正确;我觉得在这种情况下,维基百科的定义已经足够了。不过我会在未来寻找更多的技术参考! (3认同)

tho*_*ter 8

简而言之:

  • CTRL-C请求程序中止

  • CTRL-Z 挂起程序,它作为后台任务保持常驻。

    暂停程序允许您稍后使用命令恢复它fg。当您退出登录 shell 时,剩余的后台任务将被终止。

请注意CTRL-C请求程序中止,程序可能会忽略该请求。 CTRL-Z将挂起程序,除非程序特别覆盖请求。


P_O*_*O_N 6

当您按ctrl+时c,意味着您将 SIGINT 发送到您的进程。就像你输入这个命令:kill -SIGINT <your_pid>。它会杀死你的进程。这就是为什么当发出ps命令时你看不到它。
当您按ctrl+时z,意味着您向进程发送了 SIGSTOP。就像你输入这个命令:kill -SIGKSTOP <your_pid>。它会停止你的进程,但进程仍然存在。因此,您可以通过向进程发送 SIGCONT 来重新激活进程。


246*_*601 5

应该有帮助

Ctrl+Z用于通过向进程发送信号 SIGSTOP 来暂停进程,该信号不能被程序拦截。而Ctrl+C用于使用信号 SIGINT 杀死进程,并且可以被程序拦截,因此它可以在退出之前清理自己,或者根本不退出。

  • 这并不完全正确。它发送可以被程序捕获的`SIGTSTP`。有四种不同的信号,可以暂停程序`SIGSTOP`、`SIGTSTP`、`SIGTTIN`、`SIGTTOU`。其中只有`SIGSTOP`不能被阻止。其他三个由终端用于在不同条件下停止进程。 (4认同)