c语言 - 在 Linux 中使用"watch"运行时获取终端大小



我有一个简单的测试程序:

#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int main(int argc, char *argv[], char *envp[])
{
struct winsize w;
if (!ioctl(fileno(stdout), TIOCGWINSZ, &w)) {
printf("width %dn", w.ws_col);
} else {
printf("%s", strerror(errno));
}
return 0;
}

如果从终端本身运行,将返回终端窗口的大小,但由于某种原因,如果通过watch命令运行,它只会在 IOCTL(( 上失败,从而为设备返回不适当的 IOCTL。

知道为什么吗?获取终端窗口大小的最可靠方法是什么?

关键是,程序的 stdout 不再是终端,而是watch管道,它将收集程序输出并显示它。因此,您无法从标准输出文件描述符确定宽度。

但是,stdin仍然连接到终端,因此您可以使用fileno(stdin)来获取正确的终端尺寸:

if (!ioctl(fileno(stdin), TIOCGWINSZ, &w)) {
printf("width %dn", w.ws_col);

最新更新