Unix命令行中的Ctrl + Z和Ctrl + C有什么区别?


187

我正在使用Mac OS X终端。我使用Ctrl+ ZCtrl+ C停止某些程序。但是我意识到我不知道他们到底在做什么。它们是什么,它们之间有什么区别?

这个问题是本周超级用户问题
阅读2011年3月13日的博客条目以了解更多详细信息,或提交自己的“本周问题”。

Answers:


249

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

如果您暂停一个进程,它将显示在外壳中,告诉您它已被暂停:

[1]+  Stopped                 yes

但是,如果您杀死了一个,则除了被退回到Shell提示符外,您将看不到任何确认。当您暂停一个进程时,您也可以使用它来做一些花哨的事情。例如,运行此命令:

fg

程序暂停将使它回到前台。

并运行命令

bg

程序暂停后将允许它在后台运行(尽管程序的输出仍将进入TTY)。

如果您想杀死已暂停的程序,则不必fg先将其恢复,只需执行以下命令:

kill %1

如果您有多个挂起的命令,请运行

jobs

将列出它们,如下所示:

[1]-  Stopped                 pianobar
[2]+  Stopped                 yes

使用%#,其中#是作业数目(一个在方括号中从jobs输出)与bgfgkill,可用于做这项工作的动作。


3
您可以通过使用stty命令来更改哪些键可以完成哪些工作。例如stty susp ^Zstty intr ^C
RedGrittyBrick 2011年

7
实际上,它发送了SIGTSTP,可以被拦截。
Simon Richter

2
凉!因此,如果程序拒绝使用Ctrl + C终止操作,您如何强制杀死它?
Aditya MP

2
@adityamenon查找可执行文件名称,例如amarok运行killall amarok,或者运行ps aux并在可执行文件名称旁边找到进程ID并运行kill {process id}
Bruno Finger

22

Ctrl + Z暂停SIGTSTP的过程,您可以稍后恢复。Ctrl + C使用SIGINT终止该进程,除非该进程被目标处理/忽略,否则它将终止该进程,因此您将无法继续执行该进程。还有一个SIGSTOP可以发送kill(),该进程不能拦截。SIGCONT是SIGSTOP和SIGTSTP的对应物,它们可以取消该过程。


不,那是SIGTSTP,不是SIGSTOP,它可以被拦截。
sch

@sch,现在正确吗?
Ben Voigt

是的,尽管Ctrl-Z(和CTRL-C)使进程(终端的前台进程组)接收该信号,但不一定只有一个进程。还要注意,SIGTTIN和SIGTTOU发送到不在终端的前台进程组中的进程,然后在尝试从该进程进行读写时,它们也会挂起。
sch

@sch:进程与组不是仅在信号发送方式上有所不同吗?IIRC kill()可以让您发送SIGSTOP给组。
Ben Voigt

是的,我的命令是关于您的CTRL-Z挂起该进程的信息……这可能会误导人们以为它实际上是工作进程组时仅发送给一个进程。
sch

17

CTRL + Z停止(暂停)作业

CTRL + C终止作业

使用CTRL + C,您无法恢复该过程,但是使用CTRL + Z,只需在命令promt中输入即可恢复该作业:

fg %1

如果您有多个进程已暂停,则应该执行

jobs

查看输出并选择适当的数字以继续,例如

fg %3

恢复列表中的第三项工作。您还可以通过以下方式在后台运行作业

bg %n

其中n是工作编号。


那是工作(进程组),而不是CTRL-C,CTRL-Z,fg和bg处理的进程。
sch

3
Cntrl + Z pause the currently running process. 

Cntrl + C simply terminates the running process.

使用Cntrl + C您将无法继续该过程。在使用Cntrl + Z的情况下,您可以恢复该过程。

使用fg%1恢复该过程。


3

CTRL+ Z停止(暂停)工作

CTRL+ C终止工作

使用CTRL+,C您无法恢复该过程,但是使用CTRL+ Z,可以通过仅在命令提示符下输入来恢复作业:

fg%1

如果您有多个进程已暂停,则应该执行

工作

查看输出。


2

先前的答案是正确的,但由于某些未知原因,Ctrl-Z也会挂起所有子进程,但killall -SIGSTOP ...仅挂起最前面的(父)进程,并使子进程按需运行。

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.