我想我不清楚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',))..and如果我切换到tty3,会有一个外壳程序在运行-但是一些击键被忽略/永远不会被发送到外壳程序。shell知道TTY设置是不正确的,因为bash会显示类似“无法打开tty,禁用作业控制”之类的信息。
我知道'termios‘模块有更改TTY上的设置的功能,这是' TTY’模块使用的,但我找不到python正确设置TTY并启动shell的示例。我觉得它应该是简单的东西,但我不知道去哪里看。
查看*etty程序的源代码对我没有帮助-C对我来说像是希腊语:-/
也许我只是找不到合适的条件?有没有人在过去用Python替换了*etty程序,并有一个他们愿意分享的解释?
感谢您提出我的基本问题:)
发布于 2011-05-06 09:27:50
我至少可以看到你遗漏了两件事--可能还有更多:
首先,在关闭旧的标准输入/标准输出之后,在打开新的TTY之前,您需要在子进程中调用setsid()。这做了两件重要的事情--它使您的新进程成为新会话的领导者,并将其与以前的控制终端解除关联(仅仅关闭该终端是不够的)。这意味着当您打开新的tty时,它将成为控制终端,这正是您想要的。
其次,您需要设置TERM环境变量以匹配新的tty。
发布于 2011-05-06 20:05:21
您应该看一下*tty*程序的源代码,看看它们做了什么。
我的猜测是,它们主要是发出一堆ioctl命令来将终端初始化为程序通常期望的模式(例如登录等)。但是,它们中的一些可能还会提示输入用户名(而不是密码;login会这样做)。
https://stackoverflow.com/questions/5905855
复制相似问题