【问题标题】:Shell in ncurses window?ncurses窗口中的外壳?
【发布时间】:2014-09-01 00:21:33
【问题描述】:

我目前正在尝试使用 ncurses 编写一个最小的终端多路复用器。但是,当我尝试 execv 一个 shell 时,它不会打印到窗口,而是启动一个新的子进程来控制窗口(即忽略 ncurses)。

如何防止这种情况并让 ncurses 控制它?有什么方法可以获取 tty 并对其进行控制?

编辑

感谢 cmets 中的 Ross Ridge,我现在知道我需要创建一个伪终端,然后将其读入 ncurses 窗口。但是,我不知道如何让标准输出在 ncurses 窗口中打印。是否有读取文件描述符的 ncurses 函数?还是我必须以某种方式将read()printw() 一起使用?

【问题讨论】:

  • 您必须使用伪终端。它不会像您希望的那样容易。
  • 看看 GNU mc(午夜指挥官)做了什么。它实现了与您想要的类似的东西。

标签: c ncurses curses


【解决方案1】:

您将需要大致执行以下操作:

  • 创建一个 pty(伪终端)。您没有提及您使用的是哪个操作系统,但如果它基于 POSIX,man pty 会有所帮助。也看看openpty
  • pty 的从端需要连接到您正在运行的任何东西(例如 shell),而主端需要连接到您的终端仿真器。
  • 因此,您必须将fork() 和在子进程中的dup2 从fd 转移到stdinstdoutstderr
  • 然后您需要将父级中的主 fd 连接到您的 ncurses 环境(用于输出)和键盘处理(用于输入)。

This answerThis answerthis answer 可能有用,但我特别推荐第一个,因为它指的是 Stephens 的 Advanced Programming in the UNIX Environment(我已链接到更现代的版本)和 source code是可下载的。购买这本书,因为它是一种非常宝贵的资源,但如果你查看那里的pty 目录(出于版权原因,我不会复制和粘贴)你会发现forkpty 的一个很好的例子。

剩下的问题是如何从正在运行的进程的输出数据中获取到ncurses。好吧,您需要编写一个终端仿真器。选择您要模拟的终端,阅读它使用的所有控制序列,然后实现所有这些。

如果这听起来很辛苦(确实如此),我建议您改用tmuxscreen;后者完全符合您的要求,包括完整的 VT100/ANSI 终端仿真器;前者几乎一样完整。 tmux 是一个 BSD 许可程序,这意味着您可以简单地调整源以在不太可能发生的情况下进行投标。 screen 是 GPL,所以除非你的程序也是 GPL,否则它仅供参考。

【讨论】:

  • Stephen 的 UNIX 书籍绝对是必须拥有的。在它和 BSD 的联机帮助页之间,有您在 UNIX 中编程所需的一切。
  • libvterm 是一个很好的选择,它是 Neovim 用于其终端窗口的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多