每当有人为虚拟控制台设置不同的大小时,就会less
识别出窗口分辨率(我假设是……);据此,它更改了可视化的文本行数。该参数如何计算?
嗯...好的,但是我在哪里可以找到执行的程序呢?
—
GiuseppeCrinò13年
每当有人为虚拟控制台设置不同的大小时,就会less
识别出窗口分辨率(我假设是……);据此,它更改了可视化的文本行数。该参数如何计算?
Answers:
如果您正在寻找一种通过脚本进行检查的方法,则可以执行以下任一操作:
tput cols
和tput lines
操作说明但是,如果您需要详细信息,请继续:
对于虚拟终端(xterm等),有一个ioctl()
系统调用将告诉您窗口的大小。如果可以,请less
使用此调用。此外,当您更改窗口的大小时,该窗口中正在运行的任何内容都会收到一个SIGWINCH
信号,less
告知您应该检查新的窗口大小。例如,我开始less
运行(作为进程ID 16663),并使用进行连接strace
,并调整了窗口的大小。这是我看到的:
$ strace -p 16663
Process 16663 attached - interrupt to quit
read(3, 0xbfb1f10f, 1) = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
rt_sigaction(SIGWINCH, {0x805cf10, [WINCH], SA_RESTART}, {0x805cf10, [WINCH], SA_RESTART}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
ioctl(2, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
如果可以的话tput cols
,这也是tput lines
幕后的工作。有关此方法的更多信息,请参见man tty-ioctl
并搜索TIOCGWINSZ。
但是,对于其他终端,例如连接到串行端口的终端,则无法直接获取此信息。在那种情况下,less
开始寻找环境变量的线索。
LINES
并且COLUMNS
通常会设置为终端尺寸。实际上,如果bash
或zsh
可以找到终端尺寸,它将自动设置这些变量本身,以使不太聪明的程序可以轻松查看终端尺寸。但是,大多数其他shell(包括dash
和tcsh
)都不会设置这些变量。TERM
通常设置为终端类型,在这种情况下,terminfo数据库可能包含终端的预期大小。如果tput rows
不能使用IOCTL(例如,如果您通过串行端口连接),它将回落到此处记录的值。对于大小可以更改的终端,这只是一个猜测,很可能是错误的。有关更多信息,请参见man tput
有关控制终端的命令,以及man terminfo
有关可以告诉终端执行的操作的列表。
如果看一下源代码,您将知道在Linux上检索窗口大小的less
调用ioctl()
。
#ifdef TIOCGWINSZ
{
struct winsize w;
if (ioctl(2, TIOCGWINSZ, &w) == 0)
{
if (w.ws_row > 0)
sys_height = w.ws_row;
if (w.ws_col > 0)
sys_width = w.ws_col;
}
}
#else
#ifdef WIOCGETD
{
struct uwdata w;
if (ioctl(2, WIOCGETD, &w) == 0)
{
if (w.uw_height > 0)
sys_height = w.uw_height / w.uw_vs;
if (w.uw_width > 0)
sys_width = w.uw_width / w.uw_hs;
}
}
#endif
我不确定这是否是您要查找的信息。我猜为less
注册了一个信号处理程序SIGWINCH
。当终端的尺寸发生变化时,它会收到一个SIGWINCH
信号并探测tty信息以了解终端的当前尺寸。
http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html