Python:何时使用pty.fork()与os.fork()比较

Python:何时使用pty.fork()与os.fork()比较,python,linux,fork,kill,pty,Python,Linux,Fork,Kill,Pty,我不确定从我的应用程序生成外部后台进程时是使用pty.fork()还是使用os.fork()。(如国际象棋引擎) 如果父进程被杀死,我希望生成的进程死亡,就像终端中的生成应用一样 这两个分支之间的起伏是什么?过去我一直使用子流程模块来实现这一点。它为与子流程通信提供了良好的api 您可以使用call(*popenargs,**kwargs)来阻止它们的执行,我相信使用Popen类可以处理异步执行 有关更多信息,请查看 就使用os.fork和pty.fork而言,两者都高度依赖于平台,并且都不能在

我不确定从我的应用程序生成外部后台进程时是使用
pty.fork()
还是使用
os.fork()
。(如国际象棋引擎)

如果父进程被杀死,我希望生成的进程死亡,就像终端中的生成应用一样


这两个分支之间的起伏是什么?

过去我一直使用
子流程
模块来实现这一点。它为与子流程通信提供了良好的api

您可以使用
call(*popenargs,**kwargs)
来阻止它们的执行,我相信使用
Popen
类可以处理异步执行

有关更多信息,请查看


就使用
os.fork
pty.fork
而言,两者都高度依赖于平台,并且都不能在windows上工作(或至少经过测试)。通过读取文档,
pty
模块似乎是这两个模块中最受约束的一个。主要区别在于伪终端方面。因此,如果您不愿意以能够使用
子流程
模块的方式来构建代码,我可能会选择
os.fork
而不是
pty.fork
使用
os.fork()
创建的子流程从父流程继承stdin/stdout/stderr,而使用
pty.fork()创建的子流程
已连接到新的伪终端。当您在父进程中编写一个类似xterm:
pty.fork()
的程序时,您需要使用后者来返回一个描述符来控制子进程的终端,这样您就可以直观地表示其中的数据,并将用户操作转换为终端输入序列

更新:

从pty(7)手册页:

期望连接的进程 对于一个终端,可以打开从端 一个伪终端的 由一个具有 打开主端。任何 写在主端的是 提供给从机上的进程 结束,就好像它是在上面输入的一样 终点站。例如,编写 中断字符(通常为 控制(C)至主设备 会引起一个中断信号 (SIGINT)将为 前台进程组,即 连接到从机。相反地 任何写给客户的东西 伪终端can的从端 通过以下过程进行读取: 连接到主端


对于某些真正需要终端的应用程序,伪终端是必需的。交互式shell是这些示例之一,但还有许多其他示例。pty.fork选项不是作为另一个os.fork而存在,而是作为使用伪终端的特定API。

实际上,它正是我想了解更多的“伪终端方面”。我已经阅读了很多内核文档和手册,但是我还没有确切地知道我应该在什么时候使用witch。从我所做的阅读中,它谈到了能够通过代码向进程的终端进行输入/输出。因此,对我来说,这听起来像是使用stdout/stdin与应用程序通信的一个单独的范例。关于伪终端概念的更多信息:当我阅读维基百科时,伪终端接缝就像管道的替代品。当你说“通过代码进行输入/输出”时,你是指像删除和插入这样的东西,还是像管道一样的标准读/写?因此pty的目的是将子IO保持在单独的框中,而不是将其与父IO的输入/输出混在一起?我想你也可以用os.fork和一些pibe做同样的事情。这个终端除了IO之外还有其他功能吗?当然,您可以使用
pty.openpty()
os.fork()
实现
pty.fork()
(实际上您可以在
pty.py
源代码中看到它)。但是伪终端不同于管道,请参阅。在pty.py中,我看到即使pty.fork中的非os.forkpty代码也使用/dev/pty设备,因此它肯定不仅仅是输入/输出的范例。我读了文件顶部的评论,他们说:“错误:没有信号处理。不设置从终端和窗口大小”。维基百科没有提到pty在做这样的事情。。