shell在ncurses窗口?

时间:2014-09-01 00:21:33

标签: c ncurses curses

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

如何防止这种情况并让ncurses控制它?有没有办法获得tty并控制它?

修改

感谢Ross Ridge的评论,我现在知道我需要创建一个伪终端,然后我将其读入一个ncurses窗口。但是,我无法弄清楚如何在ncurses窗口中打印stdout。是否有读取文件描述符的ncurses函数?或者我必须以某种方式read()使用printw()吗?

1 个答案:

答案 0 :(得分:5)

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

  • 创建一个pty(伪终端)。您没有提到您正在使用的操作系统,但如果它是基于POSIX的,man pty将有所帮助。另请查看openpty
  • pty的slave端需要连接到你正在运行的任何东西(例如shell),而master端需要连接到你的终端仿真器。
  • 您必须fork(),并且在孩子中,dup2奴隶fd进入stdinstdoutstderr
  • 然后,您需要将父级的主fd连接到ncurses环境(用于输出)和键盘处理(用于输入)。

This answerThis answerthis answer可能会有用,但我特别推荐第一个,因为它引用了斯蒂芬斯的Advanced Programming in the UNIX Environment(我与更现代的联系在一起)版本),source code可下载。买这本书,因为它是一个非常宝贵的资源,但是如果你查看那里的pty目录(我不会因为版权原因而复制和粘贴),你会发现forkpty的一个很好的例子。 / p>

这就留下了如何从您正在运行的流程输出到ncurses的输出数据的问题。好吧,你需要编写一个终端模拟器。选择您要模拟的终端,读取它使用的所有控制序列,并实现所有这些。

如果这听起来很像辛苦(就是这样),我建议您先使用tmuxscreen;后者完全符合您的要求,包括完整的VT100 / ANSI终端仿真器;前者几乎完整。 tmux是一个BSD许可程序,这意味着您可以在不太可能发生的情况下简单地调整源代码以进行出价。 screen是GPL,所以除非你的程序也是GPL,否则它只是为了灵感。