在我不断尝试了解伪终端如何工作的过程中,我编写了一个小程序来尝试运行 bash。
问题是,我的断线似乎已经关闭。 (shell 提示符仅在我按 Enter 键后出现。)
此外,我仍然无法正确使用 ncurses 程序,例如 vi。谁能告诉我如何为此设置伪终端?
我写得不好的程序可以在这里找到,我鼓励你编译它 http://pastebin.com/xaj2cSsv。操作系统是 GNU/Linux,谢谢。
编辑:像这样编译:gcc program.c -lutil -o program
再次编辑:看起来奇怪的间距问题是由于使用 printf() 造成的,但仍然无法解决 ncurses 程序的问题。
您的程序中有几个问题。有些相对容易修复,而另一些则不太容易修复:
-
forkpty() http://linux.die.net/man/3/forkpty和它的朋友来自 BSD 和不兼容 POSIX。新程序应避免使用它们。来自pty(7) manual page http://linux.die.net/man/7/pty:
从历史上看,已经发展了两种伪终端 API:BSD 和 System V。SUSv1 基于 System V API 标准化了伪终端 API,并且该 API 应该在所有使用伪终端的新程序中使用。
你应该使用posix_openpt() http://linux.die.net/man/3/posix_openpt反而。这个问题可能并不重要,但您应该意识到这一点。
您将调用混合到原始系统调用(read() http://linux.die.net/man/2/read, write() http://linux.die.net/man/2/write) 和文件流 (printf() http://linux.die.net/man/3/printf, fgets() http://linux.die.net/man/3/fgets) 功能。这是一个很好的迷惑自己的方法。一般来说你应该选择one接近并坚持下去。在这种情况下,最好使用低级系统调用(read() http://linux.die.net/man/2/read, write() http://linux.die.net/man/2/write)以避免因 C 库函数使用的 I/O 缓冲区的存在而引起的任何问题。
您假设您的终端采用基于线路的范例,通过使用printf() http://linux.die.net/man/3/printf and fgets() http://linux.die.net/man/3/fgets。这并不总是正确的,尤其是在处理像这样的交互式程序时vim
.
您假设采用 C 风格的单字节空终止字符串范例。终端通常处理字符和字节,而不是字符串。虽然大多数字符集编码避免使用零字节,并非所有人都这样做.
由于上述 (2)、(3) 和 (4),您没有使用read() http://linux.die.net/man/2/read and write() http://linux.die.net/man/2/write正确。您应该使用它们的返回值来确定它们处理了多少字节,而不是基于字符串的函数,例如strlen() http://linux.die.net/man/3/strlen.
-
在我看来,这是最难解决的问题:您隐含地假设:
终端(或其驱动程序)是无状态的:它不是。时期。我怀疑至少有两个状态控制是导致基于 ncurses 的程序无法正常工作的原因:行模式 http://en.wikipedia.org/wiki/Terminal_%28telecommunication%29#Modes和本地回声控制 http://en.wikipedia.org/wiki/Echo_%28computing%29终端的。至少这些必须在父/主终端和从终端之间匹配,以避免各种奇怪的伪影。
只需来回传递字节即可传递终端的控制接口:但情况并非总是如此。现代虚拟终端允许通过以下方式进行一定程度的带外控制ioctl() http://linux.die.net/man/2/ioctl调用,如针对 Linux 的描述here http://linux.die.net/man/4/tty_ioctl.
处理这个问题的最简单方法可能是将父终端设置为原始模式,并让从属伪终端驱动程序处理尴尬的细节。
您可能想看看这个程序 http://man7.org/tlpi/code/online/dist/pty/script.c.html这似乎工作正常。它来自书本Linux 编程接口 http://www.man7.org/tlpi/完整的源代码是here http://man7.org/tlpi/code/online/index.html. 免责声明:我没有读过这本书,也不是在宣传它 - 我只是使用 Google 找到了该程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)