QnA*_*QnA 1 c terminal linux-kernel
我所知道的是,默认情况下,进程将文件描述符 0/1 设置为 stdin/stdout。但是vi等程序是怎么知道窗口大小的,尤其是在桌面环境下可以自由调整窗口大小的时候?我想不出这是如何通过信号发送的,所以我猜还有其他一些机制?。
我对终端模拟器一无所知,我想这可能与问题有关。任何指针都会有所帮助和赞赏。
终端的大小保存在内核内部结构中,可以通过TIOCGWINSZ
和TIOCSWINSZ
ioctls进行查询。有关ioctl_tty(2)
详细信息,请参阅联机帮助页。
每次通过TIOCSWINSZ
(例如,通过xterm
调整其 GUI 窗口的大小)设置窗口大小时,内核都会向该终端SIGWINCH
的前台进程组发送一个信号。
类似的程序vi
捕获该信号并通过TIOCGWINSZ
.
窗口大小通常由驱动伪 tty(如xterm
或sshd
)的主端的程序设置,但任何能够打开 tty 的进程(无论是在只读还是只写模式下)都可以这样做。
这些 ioctl 的命令行界面是通过该stty
程序。(例如。stty cols 80 rows 40
)。这对于真正的串行终端很有用,它没有固有的大小,也没有标准的方式来传递信息。
虽然尚未标准化[1],但所有这些都不是 Linux 特定的,并且在 BSD 或 Solaris 等其他系统上的工作方式类似。一个显着的区别是,尝试更改其控制 tty 大小的后台进程TIOCSWINSZ
将SIGTTOU
在 BSD 和 Solaris 上收到信号,但在 Linux 上不会。
在这些系统中的任何一个上,后台进程都不会收到SIGWINCH
信号,无论是在其控制 tty 调整大小时,还是在它成为前台进程时。全屏程序假定它们要么在前台运行,要么已停止,并且还会根据SIGCONT
信号查询终端大小(以及其他 tty 操作,如切换到备用屏幕或关闭规范模式)。
请注意,进程不需要有一个 tty 的打开句柄才能成为它的控制 tty,并且它可以有一个 tty 的打开句柄而不是它的控制 tty。
除了在 tty 的前台进程组中之外,没有其他方法可以通知进程终端大小的变化。此外,没有通用方法可以通知终端参数的其他更改:tcsetattr(3)
不会生成任何可以select(2)
编辑的信号或事件。
[1]即将推出的 POSIX 版本中将包含一个标准接口,带有tcgetwinsize
和tcsetwinsize
函数,可轻松实现为ioctl(TIOC[SG]WINSZ)
. 有关详细信息,请参见此处。
归档时间: |
|
查看次数: |
445 次 |
最近记录: |