当前位置: 首页>>技术问答>>正文


Ctrl-z和Ctrl-c在shell中有什么区别?

,

问题描述

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

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

最佳解决思路

如果我们将边案例放在一边,区别很简单。 Control + C几乎立即中止应用程序,而Control + Z将其暂时分流到后台中。

shell 向这些组合的底层应用程序发送不同的信号:

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

  • Control + Z(控制字符susp)将SIGTSTP发送到前台应用程序,有效地将其置于后台,暂停。如果你需要跳出像编辑器这样的东西去获取你需要的数据,这很有用。您可以通过运行fg(或%x,其中xjobs中显示的作业编号)返回到应用程序。

    我们可以运行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)the process has been stopped。所以它还活着,但它没有运行……它可以恢复。

    如果某些应用程序有持续的外部进程(如Web请求),可能会在睡眠时超时,则某些应用程序会崩溃。

次佳解决思路

Control + Z暂停进程(SIGTSTP),Control + C中断进程(SIGINT)

http://en.wikipedia.org/wiki/Control-Z

On Unix-like systems, Control+Z is the most common default keyboard mapping for the key sequence that suspends a process

http://en.wikipedia.org/wiki/Control-C

In POSIX systems, the sequence causes the active program to receive a SIGINT signal. If the program does not specify how to handle this condition, it is terminated. Typically a program which does handle a SIGINT will still terminate itself, or at least terminate the task running inside it

第三种解决思路

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

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

但是当一个进程暂停时,我们可以通过fg (resume in forground)bg (resume in background)再次恢复,但是我不能恢复一个被杀死的进程,这与使用Ctrl + CC& Ctrl + Z

如何查看暂停的进程?

通过使用作业命令,输出将是:

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

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

通过使用kill命令:

杀%n其中n将数字显示在作业命令,所以我想杀 cat :kill %1

第四种思路

This应该有所帮助

Ctrl+Z is used for suspending a process by sending it the signal SIGSTOP, which cannot be intercepted by the program. While Ctrl+C is used to kill a process with the signal SIGINT, and can be intercepted by a program so it can clean its self up before exiting, or not exit at all.

第五种思路

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

第六种思路

简而言之:

  • CTRLC请求程序中止。

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/773.html,未经允许,请勿转载。