7

我想我不清楚 getty/agetty/mgetty 程序在 linux/unix 机器上的功能是什么。我可以在 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 程序,并且有他们愿意分享的解释吗?

感谢您接受我的基本问题:)

4

2 回答 2

5

我可以看到您至少缺少两件事 - 可能还有更多:

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

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

于 2011-05-06T01:27:49.883 回答
0

您应该查看 *tty* 程序的源代码,了解它们的作用。

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

于 2011-05-06T12:05:21.090 回答