![Terminal.app 如何检测终端参数的变化?](https://linux22.com/image/1512245/Terminal.app%20%E5%A6%82%E4%BD%95%E6%A3%80%E6%B5%8B%E7%BB%88%E7%AB%AF%E5%8F%82%E6%95%B0%E7%9A%84%E5%8F%98%E5%8C%96%EF%BC%9F.png)
在一个答案对于另一个问题,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 书籍)。