终端中Ctrl-z和Ctrl-c有什么区别?
谁能告诉我ctrl + z和ctrl + 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 + C和Ctrl + 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发送到您的流程来重新激活您的流程。
简而言之:
-
CTRL – C请求程序中止 。
-
CTRL – Z强制程序暂停并进入后台 。
这允许您稍后使用命令
fg
恢复它。 退出登录shell时,剩余的后台任务将被终止。