【问题标题】:What happens when you hit ctrl+z on a process?在进程上按 ctrl+z 会发生什么?
【发布时间】:2013-09-29 05:57:57
【问题描述】:

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

76381 suspended  git clone git@bitbucket.org:kevinburke/<large-repo>.git

当进程暂停时实际发生了什么?状态是否保存在内存中?此功能是否在操作系统级别实现?当我使用fg 重新启动进程时,该进程如何能够从它停止的地方恢复执行?

【问题讨论】:

  • 这不是 相当 一个 stackoverflow 风格的问题,但有一个明确的答案,我不知道还有什么要问的。
  • 在超级用户或 stackexchange ubuntu 站点中可能会做得更好。
  • 这个question 可能会帮助您获得答案
  • @Rogue:什么? Ubuntu 不是 Unix(尽管它们都以字母 U 开头)。

标签: unix


【解决方案1】:

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

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

在 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

【讨论】:

  • 我根据kbd 标签的使用投了赞成票...不知道这是一个选项:) 顺便说一句,答案也不错。
猜你喜欢
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
相关资源
最近更新 更多