我不确定是否使用pty.fork()
或os.fork()
何时从我的应用程序生成外部后台进程。(如国际象棋引擎)
如果父进程被杀死,我希望生成的进程死亡,就像在终端中生成应用程序一样。
两个分叉之间的起起落落是什么?
创建的子进程os.fork()
从父进程继承stdin/stdout/stderr,而创建的子进程pty.fork()
连接到新的伪终端。当您编写像 xterm 这样的程序时,您需要后者:pty.fork()
在父进程中返回一个描述符来控制子进程的终端,因此您可以直观地表示来自它的数据并将用户操作转换为终端输入序列。
更新:
从 pty(7) 手册页:
一个期望连接到终端的进程,可以打开一个伪终端的从端,然后由一个已经打开主端的程序驱动。在主端写入的任何内容都会提供给从端的进程,就好像它是在终端上输入的一样。例如,将中断字符(通常是 control-C)写入主设备会导致为连接到从设备的前台进程组生成中断信号(SIGINT)。相反,写入伪终端从端的任何内容都可以被连接到主端的进程读取。
过去,我一直为此使用该subprocess
模块。它为与子进程通信提供了一个很好的 api。
您可以call(*popenargs, **kwargs)
用于阻止它们的执行,我相信使用Popen
该类可以处理异步执行。
查看文档以获取更多信息。
就使用os.fork
vs而言pty.fork
,两者都高度依赖于平台,并且都不能与 Windows 一起工作(或至少经过测试)。通过阅读文档,该pty
模块似乎是两者中更受限制的。主要区别在于伪终端方面。因此,如果您不愿意以能够使用该subprocess
模块的方式来构建您的代码,我可能会选择os.fork
使用pty.fork
.
对于某些真正需要终端的应用程序,伪终端是必需的。交互式外壳是这些示例之一,但还有许多其他示例。pty.fork 选项不是作为另一个 os.fork 存在,而是作为使用伪终端的特定 API。