首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python TTY控件

Python TTY控件
EN

Stack Overflow用户
提问于 2011-05-06 09:15:58
回答 2查看 4.4K关注 0票数 7

我想我不清楚getty/agetty/mgetty程序在linux/unix机器上的功能是什么。我可以用下面这样的代码在tty上创建一个shell:

代码语言:javascript
复制
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程序,并有一个他们愿意分享的解释?

感谢您提出我的基本问题:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-06 09:27:50

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

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

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

票数 5
EN

Stack Overflow用户

发布于 2011-05-06 20:05:21

您应该看一下*tty*程序的源代码,看看它们做了什么。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5905855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档