C 一个流程如何知道它何时';有什么背景吗?

C 一个流程如何知道它何时';有什么背景吗?,c,linux,signals,tty,C,Linux,Signals,Tty,当我scp一个文件时,我可以用^Z停止它并将它放在后台。当它在后台时,它停止打印其进度,但复制仍在继续。如果我再次将其前景化,它将恢复打印。它怎么知道?西格图?这会发生在标准ptty上吗?是的,你知道了。这个过程会捕获或忽略sigttoo(也可能是SIGTTIN,取决于它在做什么),然后它会在接收这些信号时做出适当的行为。Linux确实在普通的伪终端上发送这些信号。我和我的一位同事实际上查看了源代码并找到了答案 每当scp要打印输出时,它都会在标准输出上运行tcgetpgrp。这将返回终端的控制

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

是的,你知道了。这个过程会捕获或忽略sigttoo(也可能是SIGTTIN,取决于它在做什么),然后它会在接收这些信号时做出适当的行为。Linux确实在普通的伪终端上发送这些信号。

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


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

这可能是您的shell的一个功能吗?我想不是。我使用bin/bash(不是那么令人兴奋的shell)和sh和ksh具有相同的行为,但我必须在tty集上停止,所以在向终端写入内容时,正常的进程不会暂停。它是在后台进程试图更改tty的行规程时生成的吗?我应该说是在正常后台进程写入终端时生成的。