2013-09-29 101 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

相关问题