我一直在寻找一种从C程序中获取终端宽度的方法。我不断提出的思路是:
#include <sys/ioctl.h> #include <stdio.h> int main (void) { struct ttysize ts; ioctl(0, TIOCGSIZE, &ts); printf ("lines %d\n", ts.ts_lines); printf ("columns %d\n", ts.ts_cols); }
但是每次我尝试得到
austin@:~$ gcc test.c -o test test.c: In function ‘main’: test.c:6: error: storage size of ‘ts’ isn’t known test.c:7: error: ‘TIOCGSIZE’ undeclared (first use in this function) test.c:7: error: (Each undeclared identifier is reported only once test.c:7: error: for each function it appears in.)
这是执行此操作的最佳方法,还是有更好的方法?如果没有,我该如何工作?
编辑:固定代码是
#include <sys/ioctl.h> #include <stdio.h> int main (void) { struct winsize w; ioctl(0, TIOCGWINSZ, &w); printf ("lines %d\n", w.ws_row); printf ("columns %d\n", w.ws_col); return 0; }
您是否考虑过使用getenv()?它使您可以获取包含端子列和行的系统环境变量。
或者,使用您的方法,如果您想查看内核显示的终端大小(最好是在调整终端大小时),则需要使用TIOCGWINSZ而不是TIOCGSIZE,如下所示:
struct winsize w; ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
和完整的代码:
#include <sys/ioctl.h> #include <stdio.h> #include <unistd.h> int main (int argc, char **argv) { struct winsize w; ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); printf ("lines %d\n", w.ws_row); printf ("columns %d\n", w.ws_col); return 0; // make sure your main returns int }