roz*_*acz 28 process terminal io-redirection job-control disown
如果我关闭启动某个进程的虚拟终端,输出是直接转到/dev/null
,还是会以某种方式污染内存?
无论如何,我可以在此之后的任何时候获取输出以继续阅读吗?
[编辑]:那么,否认一个过程的那一刻是否有效地结束了我控制其输出的权力?
我还注意到,如果我否认一个停止的进程,起初一切似乎都很正常:它既不会终止,也不会显示在作业中。但是,如果我退出(并且我不是说关闭终端,只是从 退出su
,例如),该过程将终止。尽管如此,后台运行的被拒绝的进程可以保持运行。
Sté*_*nez 11
进程被“否认”这一事实仅对创建该进程的交互式 shell 有意义。这意味着外壳程序不再(不再)在其作业表中包含该进程,并且当外壳程序退出时不会将 SIGHUP 发送到该进程。它与您的问题没有真正的关系。
关于发送到已删除虚拟终端的输出会发生什么:我自己做了一些测试,我注意到 /dev/pts/x
设备不可访问,并且在指向它们的所有文件描述符都关闭之前不会再次分配。所以,我看不出为什么要存储对已删除终端的写入。我想这甚至不是由 POSIX 定义的。
关于获取写入终端的某些进程的输出,我认为这是不可能的,即使终端仍然存在¹。您所能做的就是获取终端的直接输入(即按键,或由 pty 的主部件模拟按键)。如果进程会在 stdin 上读取写入其终端的内容,那么对于大多数进程来说,这将导致自 io 循环。
关于进程终止的最后一句话,我真的不知道发生了什么,但我怀疑与进程组的前台/后台状态相关的信号(SIGTTOU、SIGTTIN、SIGHUP 或其他)的相当奇怪的行为,当会话领导者退出(例如su
,在您提到的情况下)。
对编辑的回答:不,关于输出,当一个进程被否认时,没有任何变化:它仍然连接到它的控制终端(除非它已经像守护进程那样分离了自己)。你可以看到使用ps
. 但是,您将无法使用fg
/ bg
/jobs
由壳这一过程提供了命令。这意味着可能很难从终端输入输入(需要在前台进程组中)。
—
1.除非进程愿意,或者被一些调试工具劫持(见上面的评论)。
只是为了解决这个具体问题:
如果我关闭启动某个进程的虚拟终端,输出是直接转到 /dev/null,还是会以某种方式污染内存?
终端和连接到它的程序通过 tty 设备通过像文件一样读写它来进行通信。具体来说,虚拟终端创建一个“伪tty”(简称“pty”),然后产生一个shell(或其他)进程并将该进程的stdin/out/err连接到pty。(详细信息因操作系统而异。)
当您关闭虚拟终端时,虚拟终端将关闭其连接端(pty“主”)。之后,如果连接另一端的程序写入tty,则会返回错误并且数据不会去任何地方。类似地,如果它从 tty 读取,它将返回一个 EOF(文件结束)指示符。