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


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


#1 楼

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一起可用于执行该作业。

评论


您可以使用stty命令更改哪些键可以完成哪些工作。例如stty susp ^ Z或stty intr ^ C。

– RedGrittyBrick
2011-3-27在12:08

实际上,它会发送SIGTSTP,它可以被拦截。

–西蒙·里希特(Simon Richter)
2011-3-28在7:28

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

– Aditya M P
13-10-5在7:05

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

–布鲁诺手指
16 Mar 10 '16 at 11:12

#2 楼


http://en.wikipedia.org/wiki/SIGSTOP
http://en.wikipedia.org/wiki/SIGTSTP
http://en.wikipedia.org/wiki/ SIGINT_(POSIX)

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

评论


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

–sch
13年10月1日在21:28

@sch,现在正确吗?

– Ben Voigt
13年10月1日在21:48

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

–sch
'13 -10-1在22:00



@sch:进程vs组不仅在信号发送方式上有所不同吗? IIRC kill()使您可以将SIGSTOP发送到一个组。

– Ben Voigt
13年10月1日在22:03



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

–sch
13年10月1日在22:05

#3 楼

CTRL + Z停止(暂停)作业

CTRL + C终止作业

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

fg %1


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

jobs


/>以查看输出并选择适当的编号以继续执行。例如,

fg %3


恢复列表中的第三个作业。您还可以使用

bg %n


在后台运行作业,其中n是作业编号。

评论


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

–sch
13年10月1日在22:03

#4 楼

Cntrl + Z pause the currently running process. 



Cntrl + C simply terminates the running process.


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

使用fg%1恢复该过程。

#5 楼

CTRL + Z停止(暂停)作业

CTRL + C终止作业

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


fg%1


如果您暂停了多个进程,则应该这样做


作业


以查看输出。

#6 楼

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