我正在尝试将控制台应用程序包装到一个合成环境中,就像多路复用器一样。但我注意到应用程序 mc (午夜指挥官)使用S-lang库编写,即使其 stdin 未附加到tty。 例如, cat /dev/zero|/usr/bin/mc 完全不影响应用程序的可操作性。
mc
stdin
cat /dev/zero|/usr/bin/mc
我试图理解mc在tmux中是如何工作的,但是我无法在这三个组件(mc、tmux和slang)的代码中找到魔法发生的地方。
问题是我如何以编程方式启动类似 MC 这样我就可以通过文件描述符与之交互,而实际的stdin对该应用程序根本不可用?
MC
他们正在检查 标准输入 来自终端,使用 isatty ,如果不关闭输入,则重新打开 /dev/tty .
isatty
/dev/tty
除非应用程序以这种方式执行特殊操作,否则管道输入将丢失。例如,它可以将数据读取到缓冲区中,并对其进行一些有用的操作。