终端多路复用器如何为基于 S-Lang 的控制台应用程序欺骗键盘输入?

How do terminal multiplexers spoof keyboard input for S-Lang-based console apps?

我正在尝试将控制台应用程序包装到合成环境中,就像我通过多路复用器所做的那样。但我注意到像 mc(午夜指挥官)这样使用 S-Lang 库编写的应用程序能够获得部分键盘状态,即使它们的 stdin 没有附加到 TTY。 例如,cat /dev/zero|/usr/bin/mc 完全不影响应用程序的可操作性。

我试图了解 mc 在 tmux 中是如何工作的,但我找不到这三个组件(mc、tmux 和 slang)的代码中魔法发生的地方。

问题是我如何以编程方式启动像 mc 这样的应用程序,以便我能够通过文件描述符与其交互,而实际的标准输入根本无法用于该应用程序?

他们正在检查他们的标准输入是否来自终端,使用isatty,如果没有关闭输入,重新打开 /dev/tty.

除非应用程序采用这种方法采取特殊操作,否则管道输入将丢失。例如,它可以将数据读入缓冲区并用它做一些有用的事情。