屏幕内的进程与前台进程的处理方式是否不同?

屏幕内的进程与前台进程的处理方式是否不同?

假设我有一个长时间运行的进程,long_running_proc有一个到主机的 TCP 连接host.example.com

当该进程作为前台进程与后台进程或后台进程运行时,操作系统或 shell 是否会以不同方式对待该进程screen

例如:

~ long_running_proc --connect host.example.com
...

~ screen
~ long_running_proc --connect host.example.com
[ctrl-a] + d
~

~ long_running_proc --connect host.example.com &
[1] 67539
~

是否有不同的规则来处理中断或上下文切换?他们的优先级较低吗?我是否更有可能通过屏蔽/后台进程获得 TCP 超时?

答案1

一般来说,通过默认唯一的区别是,如果它在后台尝试读取(或写入)tty,它将收到 SIGTTIN(或 SIGTTOU)信号。

关于优先级或更高上下文切换的其他差异取决于您的 shell(或screen)是否愿意执行此类操作,例如更改进程的“nice”编号或可能将其绑定到一个特定的 CPU,以及该 CPU 是否碰巧被中断很多。通常除非有要求,shell 不会执行此类操作。

TCP 超时的较高概率可能与您的进程是否被上述信号之一阻止(由于尝试 tty 访问),在这种情况下,它将没有任何机会接收并因此回复网络流量。

如果您仔细想想,守护进程可能是最“后台”的进程,而且它们当然不是二等进程。

我无法确切地了解具体的screen分离操作,但其文档表明分离的进程继续运行,并且screen 分离本身来自进程的 tty,因此该进程基本上继续进行,与正常的前台或后台操作没有区别。但是,由于交互式终端与进程的虚拟终端分离,因此向它发出命令会遇到困难。如果您的进程在某些时候需要来自终端的输入,这可能对您的进程不利。

相关内容