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

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

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

如果我们将边缘情况留到一边,差异很简单。 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 ps aux | grep TEST 。 这将向我们展示nano工艺仍在运行:

     oli 3278 0.0 0.0 14492 3160 pts/4 T 13:59 0:00 nano TEST 

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

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

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

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

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

但是当进程暂停时,我们可以通过fg (resume in forground)bg (resume in background) fg (resume in forground)再次恢复它,但是我无法恢复被杀死的进程,这是使用Ctrl + CCtrl + Z之间的区别。

如何查看暂停的流程?

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

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

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

通过使用kill命令:

kill%n其中n将是jobs命令中显示的数字,所以我想杀死cat: kill %1

这应该有所帮助

Ctrl + Z用于通过向其发送信号SIGSTOP来暂停进程,该信号不能被程序拦截。 虽然Ctrl + C用于使用SIGINT信号终止进程,并且可以被程序截获,因此它可以在退出之前清除自身,或者根本不退出。

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

简而言之:

  • CTRLC请求程序中止

  • CTRLZ强制程序暂停并进入后台

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