【问题标题】:how does a process know when it's been backgrounded?进程如何知道它何时被后台处理?
【发布时间】:2009-06-16 14:53:13
【问题描述】:

当我 scp 一个文件时,我可以用 ^Z 停止它并将它放在后台。当它在后台时,它会停止打印其进度,但复制会继续。如果我再次将其置于前台,它将继续打印。它是怎么知道的?看头?这会发生在标准 ptty 上吗?

【问题讨论】:

  • 这可能是你的 shell 的一个特性吗?
  • 我认为没有。我使用 bin/bash(不是那种令人兴奋的 shell)并且 sh 和 ksh 具有相同的行为

标签: c linux signals tty


【解决方案1】:

是的,你明白了。该进程将捕获或忽略 SIGTTOU(可能还有 SIGTTIN,这取决于它在做什么),然后在接收到这些信号时它会表现得适当。 Linux 确实会在普通伪终端上发送这些信号。

【讨论】:

  • 但我的 tty 集上有 -tostop,因此在向终端写入内容时,正常的 procs 不会暂停。它是在后台 proc 尝试更改 tty 的线路规则时生成的吗?
  • 我应该说当正常的 backgrounded procs 写入终端时。
【解决方案2】:

我的一个同事和我实际上查看了源代码并找到了答案。

每当 scp 即将打印输出时,它都会在标准输出上运行 tcgetpgrp。这将返回终端的控制进程组(假设它是一个终端)。仅当控制终端的进程组与 scp 的进程组相同时才会打印出来。原来不需要信号! (虽然它确实处理 SIGWINCH 来计算进度线的大小)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2014-12-09
    • 2015-10-21
    相关资源
    最近更新 更多