Unix 点击ctrl+;在一个过程中?

Unix 点击ctrl+;在一个过程中?,unix,Unix,如果我正在运行一个长时间运行的进程,当我用Ctrl+Z停止它时,我会在终端中收到以下消息: 76381 suspended git clone git@bitbucket.org:kevinburke/<large-repo>.git 76381挂起的git克隆git@bitbucket.org:kevinburke/.git 当进程暂停时,实际会发生什么?状态是否保存在内存中?此功能是否在操作系统级别实现?当我用fg重新启动进程时,进程如何能够在停止的位置恢复执行?当在终端中

如果我正在运行一个长时间运行的进程,当我用Ctrl+Z停止它时,我会在终端中收到以下消息:

76381 suspended  git clone git@bitbucket.org:kevinburke/<large-repo>.git
76381挂起的git克隆git@bitbucket.org:kevinburke/.git
当进程暂停时,实际会发生什么?状态是否保存在内存中?此功能是否在操作系统级别实现?当我用
fg
重新启动进程时,进程如何能够在停止的位置恢复执行?

当在终端中按Ctrl+Z时,(伪)终端设备驱动程序(内核)的行规程向终端设备的前台进程组中的所有进程发送
SIGTSTP
信号

该进程组是终端设备的一个属性。通常,shell是定义哪个进程组是终端设备的前台进程组的进程

在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

这不是一个stackoverflow风格的问题,但有一个明确的答案,我不知道还有什么地方可以问。在超级用户或stackexchange ubuntu站点中可能会做得更好。这可能会帮助您获得answer@Rogue:什么?Ubuntu不是Unix(即使它们都以字母U开头)。我是根据
kbd
标签的使用来投票的。。。我不知道这是一个选择:)顺便说一句,答案也不错。