Python TTY控件

Python TTY控件,python,linux,unix,tty,termios,Python,Linux,Unix,Tty,Termios,我想我不清楚在linux/unix机器上getty/agetty/mgetty程序的功能是什么。我可以在tty上启动一个shell,如下所示: TTY = '/dev/tty3' cpid = os.fork() if cpid == 0: os.closerange(0, 4) sys.stdin = open(TTY, 'r') sys.stdout = open(TTY, 'w') sys.stderr = open(TTY, 'w') os.ex

我想我不清楚在linux/unix机器上getty/agetty/mgetty程序的功能是什么。我可以在tty上启动一个shell,如下所示:

TTY = '/dev/tty3'

cpid = os.fork()
if cpid == 0:
    os.closerange(0, 4)
    sys.stdin = open(TTY, 'r')
    sys.stdout = open(TTY, 'w')
    sys.stderr = open(TTY, 'w')
    os.execv(('/bin/bash',), ('bash',))
..如果我切换到tty3,就会有一个shell在运行-但是一些击键被忽略/从未发送到shell。shell知道TTY设置不正确,因为bash会说“无法打开TTY,作业控制已禁用”

我知道“termios”模块具有更改TTY设置的功能,“TTY”模块使用这些功能,但我找不到python正确设置TTY并启动shell的示例。我觉得应该很简单,但我不知道该去哪里找

查看*etty程序的源代码对我没有帮助-C在我看来像希腊语:-/

也许我只是找不到合适的术语?在过去,有人用Python替换了*etty程序,并愿意分享他们的解释吗


谢谢你回答我的基本问题:)

我至少可以看出你遗漏了两件事——可能还有更多:

首先,在关闭旧的标准输入/标准输出后,在打开新的TTY之前,需要在子进程中调用
setsid()。这做了两件重要的事情——它使您的新进程成为新会话的领导者,并将其与以前的控制终端断开关联(仅关闭该终端是不够的)。这意味着,当您打开新的tty时,它将成为您想要的控制终端


其次,您需要设置
术语
环境变量以匹配新的tty。

您应该查看*tty*程序的源代码,以了解它们的功能

我的猜测是,他们大多会发出一系列ioctl命令,将终端初始化为程序通常期望的模式(例如登录等)。但是,其中一些可能会提示输入用户名(而不是密码;登录就是这样做的)。

os.setsid()就是全部!我知道这必须很容易。非常感谢。