如果我運行一個長期運行的進程,當我與Ctrl鍵停止 + ž,我得到了我的終端以下消息:當你在進程中點擊ctrl + z時會發生什麼?
76381 suspended git clone [email protected]:kevinburke/<large-repo>.git
當處理暫停實際發生的?國家是否在記憶中?此功能是否在操作系統級別上實現?當我用fg
重新啓動它時,過程如何能夠從其停止的地方繼續執行?
如果我運行一個長期運行的進程,當我與Ctrl鍵停止 + ž,我得到了我的終端以下消息:當你在進程中點擊ctrl + z時會發生什麼?
76381 suspended git clone [email protected]:kevinburke/<large-repo>.git
當處理暫停實際發生的?國家是否在記憶中?此功能是否在操作系統級別上實現?當我用fg
重新啓動它時,過程如何能夠從其停止的地方繼續執行?
當在終端擊中Ctrl鍵 + Ž,(僞)終端設備驅動程序(內核)的線路規程發送一個SIGTSTP
信號到所有進程的前臺進程組中終奌站。
該進程組是終端的屬性。通常,您的shell是定義哪個進程組是前臺進程組終端的進程。
在外殼術語中,進程組被稱爲「工作」,你可以把工作中的前景和背景與fg
和bg
命令,並瞭解與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
我投票基於使用'kbd'標籤...不知道這是一個選項:)順便說一句,好的答案。 – Charlie74
這不是* *相當計算器一個問題的風格,但有一個明確的答案,我不知道還有什麼地方要問。 –
可能會在超級用戶或stackexchange ubuntu站點上做得更好。 – Rogue
這[問題](http://superuser.com/questions/262942/whats-different-between-ctrlz-and-ctrlc-in-unix-command-line)可能會幫助你獲得答案 – smac89