shell在ncurses窗口?

Cha*_*esL 3 c curses ncurses

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

我怎样才能防止这种情况并让ncurses控制它?有没有办法获得tty并控制它?

编辑

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

abl*_*igh 5

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

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

这个答案,这个答案这个答案可能很有用,但我特别建议第一个给出它在UNIX环境中引用Stephens的高级编程(我已经链接到更现代的版本),并且源代码是可下载的.买这本书,因为它是一个非常宝贵的资源,但是如果你查看pty那里的目录(我不会因为版权原因而复制和粘贴),你会找到一个很好的例子forkpty.

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

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

  • [libvterm](http://www.leonerd.org.uk/code/libvterm/) 是一个不错的选择,Neovim 将其用于终端窗口。 (3认同)