当你在进程上点击ctrl + z时会发生什么?

Kev*_*rke 3 unix

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

76381 suspended  git clone git@bitbucket.org:kevinburke/<large-repo>.git
Run Code Online (Sandbox Code Playgroud)

流程暂停时实际发生了什么?国家是否被记忆?此功能是否在操作系统级别实施?当我重新启动它时,该过程如何能够从中断处继续执行fg

Ste*_*las 10

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

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

在shell术语中,进程组称为"作业",您可以使用fgand 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
Run Code Online (Sandbox Code Playgroud)