我目前正在尝试使用ncurses编写一个最小的终端多路复用器。但是,当我尝试execv
一个shell时,它不会打印到窗口,而是启动一个新的子进程来控制窗口(即忽略ncurses)。
如何防止这种情况并让ncurses控制它?有没有办法获得tty并控制它?
修改
感谢Ross Ridge的评论,我现在知道我需要创建一个伪终端,然后我将其读入一个ncurses窗口。但是,我无法弄清楚如何在ncurses窗口中打印stdout。是否有读取文件描述符的ncurses函数?或者我必须以某种方式read()
使用printw()
吗?
答案 0 :(得分:5)
您需要大致执行以下操作:
man pty
将有所帮助。另请查看openpty
fork()
,并且在孩子中,dup2
奴隶fd进入stdin
,stdout
和stderr
This answer,This answer和this answer可能会有用,但我特别推荐第一个,因为它引用了斯蒂芬斯的Advanced Programming in the UNIX Environment(我与更现代的联系在一起)版本),source code可下载。买这本书,因为它是一个非常宝贵的资源,但是如果你查看那里的pty
目录(我不会因为版权原因而复制和粘贴),你会发现forkpty
的一个很好的例子。 / p>
这就留下了如何从您正在运行的流程输出到ncurses
的输出数据的问题。好吧,你需要编写一个终端模拟器。选择您要模拟的终端,读取它使用的所有控制序列,并实现所有这些。
如果这听起来很像辛苦(就是这样),我建议您先使用tmux
或screen
;后者完全符合您的要求,包括完整的VT100 / ANSI终端仿真器;前者几乎完整。 tmux
是一个BSD许可程序,这意味着您可以在不太可能发生的情况下简单地调整源代码以进行出价。 screen
是GPL,所以除非你的程序也是GPL,否则它只是为了灵感。