LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2472|回复: 5

能否获取终端的大小?(C语言)

[复制链接]
发表于 2007-10-5 15:30:35 | 显示全部楼层 |阅读模式
就是当前工作终端的长和宽。如果用curses的话不想用initscr(),就是想在普通的界面下得到这个参数。

在SHELL里好像可以用$LINES和$COLS直接获得,不知可以用C语言获取Shell中的变量吗?
发表于 2007-10-6 07:59:18 | 显示全部楼层
This could be helpful:
  1. #include <stdio.h>
  2. #include <sys/ioctl.h>
  3. int
  4. main (int argc, char *argv[])
  5. {
  6.   struct winsize size;
  7.   int input_fd = 0;
  8.   if (ioctl (input_fd, TIOCGWINSZ, &size) == -1)
  9.     fprintf (stderr, "cannot get terminal size\n");
  10.   else
  11.     printf ("rows: %d\tcolumns: %d\n", size.ws_row, size.ws_col);
  12.   return 0;
  13. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-8 21:55:19 | 显示全部楼层
thanks
回复 支持 反对

使用道具 举报

发表于 2007-10-18 14:21:08 | 显示全部楼层
From Busybox
  1. int get_terminal_width_height(const int fd, int *width, int *height)
  2. {
  3.     struct winsize win = { 0, 0, 0, 0 };
  4.     int ret = ioctl(fd, TIOCGWINSZ, &win);
  5.     if (height) {
  6.         if (!win.ws_row) {
  7.             char *s = getenv("LINES");
  8.             if (s) win.ws_row = atoi(s);
  9.         }
  10.         if (win.ws_row <= 1 || win.ws_row >= 30000)
  11.             win.ws_row = 24;
  12.         *height = (int) win.ws_row;
  13.     }
  14.     if (width) {
  15.         if (!win.ws_col) {
  16.             char *s = getenv("COLUMNS");
  17.             if (s) win.ws_col = atoi(s);
  18.         }
  19.         if (win.ws_col <= 1 || win.ws_col >= 30000)
  20.             win.ws_col = 80;
  21.         *width = (int) win.ws_col;
  22.     }
  23.     return ret;
  24. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-10-18 22:28:46 | 显示全部楼层
Post by Arthur.Echo
From Busybox
  1. int get_terminal_width_height(const int fd, int *width, int *height)
  2. {
  3.     struct winsize win = { 0, 0, 0, 0 };
  4.     int ret = ioctl(fd, TIOCGWINSZ, &win);

  5.     if (height) {
  6.         if (!win.ws_row) {
  7.             char *s = getenv("LINES");
  8.             if (s) win.ws_row = atoi(s);
  9.         }
  10.         if (win.ws_row <= 1 || win.ws_row >= 30000)
  11.             win.ws_row = 24;
  12.         *height = (int) win.ws_row;
  13.     }

  14.     if (width) {
  15.         if (!win.ws_col) {
  16.             char *s = getenv("COLUMNS");
  17.             if (s) win.ws_col = atoi(s);
  18.         }
  19.         if (win.ws_col <= 1 || win.ws_col >= 30000)
  20.             win.ws_col = 80;
  21.         *width = (int) win.ws_col;
  22.     }

  23.     return ret;
  24. }
复制代码

请问要导入什么库吗?
回复 支持 反对

使用道具 举报

发表于 2007-10-19 08:44:29 | 显示全部楼层
Post by Xorcerer
请问要导入什么库吗?

不需要,该函数没有用到什么特殊的库函数,我就看到ioctl和getenv,这些都是常用的,不需要与什么特殊的库连接,默认就好
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表