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