这比你想象的要困难。
您需要了解终端是如何工作的——它们使用特殊的控制序列来移动光标或颜色输出。这由终端特定的terminfo文件描述。Ncurses
使用 terminfo 将 API 调用(例如将光标移动到某个位置)转换为此类控制序列。
由于终端(现在xterm
, gnome-terminal
, screen
,tmux
等)位于客户端,因此您必须将终端的类型从客户端传递给服务器。这就是为什么例如ssh
将此信息从 ssh 客户端传递到服务器的原因(尝试echo $TERM
在您的 ssh 会话中 - 如果您通过控制台登录,它可能是“linux”,或者如果您使用 X 和 xterm,它可能是“xterm”)。此外,您最好在服务器上提供相应的 terminfo。
另一个难题是伪终端。由于现在使用串行终端的人相对较少,因此它们的语义被模拟,以便curses
最初为串行控制台开发的应用程序和库(例如及其朋友)继续工作。这是通过伪终端实现的——这些就像管道一样,主设备和从设备进行通信,任何写在一侧的东西都会从另一侧出来。例如,对于登录过程,getty
可以只使用 pty 设备的一侧并认为它是串行线路 -您的服务器程序必须处理 pty 的另一侧,将它从 pty 获得的所有内容通过网络发送到您的客户端.
终端仿真器也使用 ptys,在您的终端中键入,如果您使用的是终端仿真器tty
,您会得到类似的东西。/dev/pts/9
在 pty 的另一边,它通常是你的 shell,通过 pty 与你的终端仿真器通信。
您的客户端程序或多或少可以只使用标准输入和标准输出。如果您的终端信息是正确的,其余的将由您的终端仿真器处理,只需将您从服务器程序接收到的任何内容传递到stdout
,并将您读取的任何内容发送stdin
到您的服务器程序。
希望我没有遗漏任何重要的细节。祝你好运!