2013-09-29 72 views
3

如果我運行一個長期運行的進程,當我與Ctrl鍵停止 + ž,我得到了我的終端以下消息:當你在進程中點擊ctrl + z時會發生什麼?

76381 suspended git clone [email protected]:kevinburke/<large-repo>.git 

當處理暫停實際發生的?國家是否在記憶中?此功能是否在操作系統級別上實現?當我用fg重新啓動它時,過程如何能夠從其停止的地方繼續執行?

+0

這不是* *相當計算器一個問題的風格,但有一個明確的答案,我不知道還有什麼地方要問。 –

+0

可能會在超級用戶或stackexchange ubuntu站點上做得更好。 – Rogue

+0

這[問題](http://superuser.com/questions/262942/whats-different-between-ctrlz-and-ctrlc-in-unix-command-line)可能會幫助你獲得答案 – smac89

回答

9

當在終端擊中Ctrl鍵 + Ž,(僞)終端設備驅動程序(內核)的線路規程發送一個SIGTSTP信號到所有進程的前臺進程組中終奌站。

該進程組是終端的屬性。通常,您的shell是定義哪個進程組是前臺進程組終端的進程。

在外殼術語中,進程組被稱爲「工作」,你可以把工作中的前景和背景與fgbg命令,並瞭解與jobs命令當前運行的作業。

SIGTSTP信號與SIGSTOP信號相似,只是與SIGSTOP相反,SIGTSTP可以由進程處理。

接收到這樣的信號後,該過程被暫停。也就是說,它已暫停並仍在那裏,只有在它死亡或發送了一個SIGCONT信號以恢復執行之前,它纔會被安排再次運行。開始工作的shell將會等待其中的進程組的負責人。如果它被掛起,則wait()將返回,指示進程已暫停。然後,shell可以更新作業的狀態,並告訴它它已被暫停。

$ sleep 100 | sleep 200 & # start job in background: two sleep processes 
[1] 18657 18658 
$ ps -lj # note the PGID 
F S UID PID PPID PGID SID C PRI NI ADDR SZ WCHAN TTY   TIME CMD 
0 S 10031 18657 26500 18657 26500 0 85 5 - 2256 -  pts/2 00:00:00 sleep 
0 S 10031 18658 26500 18657 26500 0 85 5 - 2256 -  pts/2 00:00:00 sleep 
0 R 10031 18692 26500 18692 26500 0 80 0 - 2964 -  pts/2 00:00:00 ps 
0 S 10031 26500 26498 26500 26500 0 80 0 - 10775 -  pts/2 00:00:01 zsh 
$ jobs -p 
[1] + 18657 running sleep 100 | 
    running sleep 200 
$ fg 
[1] + running sleep 100 | sleep 200 
^Z 
zsh: suspended sleep 100 | sleep 200 
$ jobs -p 
[1] + 18657 suspended sleep 100 | 
    suspended sleep 200 
$ ps -lj # note the "T" under the S column 
F S UID PID PPID PGID SID C PRI NI ADDR SZ WCHAN TTY   TIME CMD 
0 T 10031 18657 26500 18657 26500 0 85 5 - 2256 -  pts/2 00:00:00 sleep 
0 T 10031 18658 26500 18657 26500 0 85 5 - 2256 -  pts/2 00:00:00 sleep 
0 R 10031 18766 26500 18766 26500 0 80 0 - 2964 -  pts/2 00:00:00 ps 
0 S 10031 26500 26498 26500 26500 0 80 0 - 10775 -  pts/2 00:00:01 zsh 
$ bg %1 
[1] + continued sleep 100 | sleep 200 
$ ps -lj 
F S UID PID PPID PGID SID C PRI NI ADDR SZ WCHAN TTY   TIME CMD 
0 S 10031 18657 26500 18657 26500 0 85 5 - 2256 -  pts/2 00:00:00 sleep 
0 S 10031 18658 26500 18657 26500 0 85 5 - 2256 -  pts/2 00:00:00 sleep 
0 R 10031 18824 26500 18824 26500 0 80 0 - 2964 -  pts/2 00:00:00 ps 
0 S 10031 26500 26498 26500 26500 0 80 0 - 10775 -  pts/2 00:00:01 zsh 
+0

我投票基於使用'kbd'標籤...不知道這是一個選項:)順便說一句,好的答案。 – Charlie74

相關問題