題 在Unix命令行中Ctrl + Z和Ctrl + C有什麼不同?


我正在使用Mac OS X終端。我用 按Ctrl+ž 要么 按Ctrl+C 停止一些程序。但我意識到我不知道他們到底在做什麼。它們是什麼,它們之間有什麼區別?

這個問題是一個 本週超級用戶問題
  閱讀2011年3月13日 博客文章 了解更多詳情或 提交你自己的 本週的問題。


181
2018-03-27 00:39


起源




答案:


控制+ž 用於通過向其發送信號來暫停進程 SIGSTOP,該程序無法截獲。而 控制+C 用於使用信號終止進程 SIGINT,並且可以被程序攔截,以便它可以在退出之前清理自己,或者根本不退出。

如果你暫停一個進程,這將顯示在shell中,告訴你它已被暫停:

[1]+  Stopped                 yes

但是,如果您殺了一個,除了被退回到shell提示符之外,您將看不到任何確認。當你暫停一個過程時,你也可以使用它做一些奇特的事情。例如,運行這個:

fg

暫停程序會將其帶回前台。

並運行命令

bg

暫停程序將允許它在後台運行(程序的輸出仍然會轉到TTY)。

如果你想殺死一個被暫停的程序,你不必帶回來 fg 首先,您可以簡單地執行命令:

kill %1

如果您有多個掛起的命令,則運行

jobs

會列出它們,如下所示:

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

運用 %#,哪裡 # 是工作號碼(方括號中的那個) jobs 輸出) bgfg, 要么 kill,可用於對該工作進行操作。


238
2018-03-27 01:15



您可以使用更改哪些鍵來更改哪個鍵 stty 命令。例如 stty susp ^Z  要么 stty intr ^C。 - RedGrittyBrick
實際上,它發送SIGTSTP,可以截獲。 - Simon Richter
涼!所以如果一個程序拒絕用Ctrl + C來死,你怎麼強行殺死它? - Aditya M P
@adityamenon查找可執行文件名稱 amarok 並運行 killall amarok,或運行 ps aux 並找到可執行文件名稱旁邊的進程ID並運行 kill {process id}。 - Bruno Finger


Ctrl + Z使用SIGTSTP掛起進程,稍後可以恢復。 Ctrl + C使用SIGINT終止進程,該進程終止進程,除非目標處理/忽略它,因此您無法恢復它。還有一個可以發送的SIGSTOP kill() 哪個過程無法攔截。 SIGCONT是SIGSTOP和SIGTSTP的對應物,可以取消暫停該過程。


22
2018-03-27 00:43



不,這是SIGTSTP,而不是SIGSTOP,它可以被截獲。 - sch
@sch,現在是正確的嗎? - Ben Voigt
是的,雖然Ctrl-Z(和CTRL-C)會導致進程 組 (終端的前台進程組)接收該信號,不一定只有一個進程。還要注意SIGTTIN和SIGTTOU發送到不在終端的前台進程組中的進程,然後嘗試從/向它讀取或寫入,也暫停它們。 - sch
@sch:進程vs組不僅僅是信號發送方式的差異嗎? IIRC kill() 讓你發送 SIGSTOP 對一群人來說很好。 - Ben Voigt
是的,我的命令是關於你的 CTRL-Z暫停該過程...... 這可能會誤導人們認為它實際上只是一個進程 工作 要么 過程組。 - sch


CTRL + Z停止(暫停)作業

CTRL + C終止作業

使用CTRL + C,您無法恢復該過程,但使用CTRL + Z,只需輸入命令promt即可恢復該作業:

fg %1

如果你有多個進程暫停,那麼你應該這樣做

jobs

查看輸出並選擇要恢復的適當數字,例如

fg %3

恢復列表中的第三個作業。您還可以在後台運行作業

bg %n

其中n是工作號碼。


17
2018-03-27 11:52



那是作業(進程組),而不是CTRL-C,CTRL-Z,fg和bg處理的進程。 - sch


Cntrl + Z pause the currently running process. 

Cntrl + C simply terminates the running process.

使用Cntrl + C您無法恢復該過程。在使用Cntrl + Z的地方你可以恢復這個過程。

使用fg%1恢復該過程。


3
2018-03-13 06:48





CTRL+ž 停止(暫停)工作

CTRL+C終止工作

CTRL+C 你不能恢復這個過程,但是 CTRL+ž 只需在命令提示符處輸入即可恢復作業:

fg%1

如果您暫停了多個進程,那麼您應該這樣做

工作

看到輸出。


3
2017-07-03 15:57





之前的答案是正確的,但由於某些未知的原因,Ctrl-Z也會暫停所有子進程,但killall -SIGSTOP ...隻掛起最前面(父)進程並讓子進程按照自己的意願運行。


2
2018-02-26 17:19