Terminal.app 如何检测终端参数的变化?

Terminal.app 如何检测终端参数的变化?

一个答案对于另一个问题,Chris Page 说 Terminal 可以检测终端参数是否处于可能用于输入密码的状态。例如,终端可能处于 Cooked 模式,并且字符回显已关闭。

Terminal 如何检测到这一点?是否有 API 可用于订阅终端参数的更改?Terminal 会轮询吗?当终端参数更改时,是否会向终端发送特殊字符?

答案1

终端使用 tcgetattr(3) x-man-page://3/tcgetattr 轮询 tty 设备状态并检查 c_lflag ICANON 标志是否设置以及 ECHO 标志是否未设置。

它在接收远程程序的输出后进行轮询,或者当用户使用内联输入法输入文本时,可能需要阻止将用户输入显示为“标记”文本。

答案2

由于 Terminal.app闭源,没有人能猜到它到底做了什么(轮询或 Apple 提供的一些通知功能)。无论如何,它确实可以完全控制主/从伪终端之间移动的数据,并且可以使用 POSIX termios 调用轮询这些数据,例如tcgetattr查看当前的终端模式。

答案3

终端应用程序通过 pty(伪)设备与 shell(bash)进程通信。当 bash 或其他进程进入“密码”模式时,它会通过发送ANSI 转义序列

我不确定另一个进程是否可以拦截通信(必须查看我的 POSIX 书籍)。

相关内容