在C获得terminal宽度?

我一直在寻找一种方法来获取我的C程序中的terminal宽度。 我一直在提出的是:

#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() ? 它允许您获取包含terminal列和行的系统环境variables。

或者使用你的方法,如果你想看看内核看到的是什么terminal大小(更好的情况下,terminalresize),你需要使用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 } 

这个例子有点冗长,但我相信这是检测terminal尺寸的最便捷的方式。 这也处理resize的事件。

正如Tim和rlbond所说,我正在使用ncurses。 与直接读取环境variables相比,它保证了terminal兼容性的极大提高。

 #include <ncurses.h> #include <string.h> #include <signal.h> // SIGWINCH is called when the window is resized. void handle_winch(int sig){ signal(SIGWINCH, SIG_IGN); // Reinitialize the window to update data structures. endwin(); initscr(); refresh(); clear(); char tmp[128]; sprintf(tmp, "%dx%d", COLS, LINES); // Approximate the center int x = COLS / 2 - strlen(tmp) / 2; int y = LINES / 2 - 1; mvaddstr(y, x, tmp); refresh(); signal(SIGWINCH, handle_winch); } int main(int argc, char *argv[]){ initscr(); // COLS/LINES are now set signal(SIGWINCH, handle_winch); while(getch() != 27){ /* Nada */ } endwin(); return(0); } 
 #include <stdio.h> #include <stdlib.h> #include <termcap.h> #include <error.h> static char termbuf[2048]; int main(void) { char *termtype = getenv("TERM"); if (tgetent(termbuf, termtype) < 0) { error(EXIT_FAILURE, 0, "Could not access the termcap data base.\n"); } int lines = tgetnum("li"); int columns = tgetnum("co"); printf("lines = %d; columns = %d.\n", lines, columns); return 0; } 

需要用-ltermcap编译。 使用termcap还有很多其他有用的信息。 使用info termcap检查termcap手册以获取更多详细信息。

如果您安装了ncurses并正在使用它,则可以使用getmaxyx()来查找terminal的尺寸。

这里是对已经build议的环境variables的函数调用:

 int lines = atoi(getenv("LINES")); int columns = atoi(getenv("COLUMNS")); 

假设你在Linux上,我想你想用ncurses库来代替。 我很确定你的ttysize的东西不在stdlib中。