Unix 命令行中的 Ctrl+Z 和 Ctrl+C 有什么不同?

Eon*_*nil 209 unix command-line

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

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

Wuf*_*ers 277

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

如果您挂起一个进程,这将显示在 shell 中,告诉您它已被挂起:

[1]+  Stopped                 yes
Run Code Online (Sandbox Code Playgroud)

但是,如果你杀死一个,除了被退回到 shell 提示之外,你不会看到任何确认。当你暂停一个进程时,你也可以用它做一些花哨的事情。例如,运行这个:

fg
Run Code Online (Sandbox Code Playgroud)

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

并运行命令

bg
Run Code Online (Sandbox Code Playgroud)

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

如果你想杀死一个挂起的程序,你不必fg先把它带回来,你可以简单地执行以下命令:

kill %1
Run Code Online (Sandbox Code Playgroud)

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

jobs
Run Code Online (Sandbox Code Playgroud)

将列出它们,如下所示:

[1]-  Stopped                 pianobar
[2]+  Stopped                 yes
Run Code Online (Sandbox Code Playgroud)

使用%#,其中#是作业编号(jobs输出中方括号中的编号)bgfg, 或kill可用于对该作业执行操作。

  • 其实就是发送SIGTSTP,可以拦截。 (9认同)
  • 您可以使用 `stty` 命令更改哪些键执行哪些工作。例如`stty susp ^Z` 或`stty intr ^C`。 (3认同)
  • 凉爽的!因此,如果程序拒绝使用 Ctrl+C 终止,您如何强制终止它? (2认同)
  • @adityamenon 找到可执行文件名称,例如`amarok` 并运行`killall amarok`,或者运行`ps aux` 并找到可执行文件名称旁边的进程id 并运行`kill {process id}`。 (2认同)

Ben*_*igt 24

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


小智 18

CTRL+Z 停止(暂停)一个工作

CTRL+C 终止作业

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

fg %1
Run Code Online (Sandbox Code Playgroud)

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

jobs
Run Code Online (Sandbox Code Playgroud)

查看输出并选择适当的数字来恢复例如

fg %3
Run Code Online (Sandbox Code Playgroud)

恢复列表中的第三个作业。您还可以在后台运行作业

bg %n
Run Code Online (Sandbox Code Playgroud)

其中 n 是工作编号。