Решено: Информация о терминале

Модератор: Модераторы разделов

Аватара пользователя
Liksys
Сообщения: 2910

Решено: Информация о терминале

Сообщение Liksys »

В общем, как получить информацию о параметрах терминала? Нужен по большей части только параметр с максимальной длиной строки.
Делать getenv("COLUMNS") не предлагать, этот вариант не всегда работает, а только когда переменная експортирована. Очевидно, есть какой-то более правильный способ. Программа запускается в консоли (виртуале, xterm, konsole, etc.), необходимо, чтобы она подстраивалась под длину строки.
Как осуществляется? В поиск, пожалуйста, не посылать, кроме terminfo и termcap ниче не нашел, да и это наверно не совсем то.
Если можно, подкиньте пример.
Спасибо сказали:
pktfag
Сообщения: 142
ОС: Arch Linux

Re: Решено: Информация о терминале

Сообщение pktfag »

Вроде максимальную длину строки в терминале пытается определить ./configure. Попробуй посмотри в каких-нибудь исходниках.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Решено: Информация о терминале

Сообщение Liksys »

ага потом размер консоли изменил и все поехало
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Решено: Информация о терминале

Сообщение Uncle_Theodore »

Есть такая команда resize(1x), она умеет менять значения переменных TERMCAP и termnl на параметры xterm'а, в котором она вызвана. Я думаю, имеет смысл посмотреть на ее исходники.
Чисто формально, как я себе это представляю, надо запросить X-сервер по поводу параметров окошка, в котором мы вызваны.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Решено: Информация о терминале

Сообщение Liksys »

Про resize - посморю, спасибо.
X-сервер может быть не запущен.
Мне это вообще надо для нового движка в словарь. Там перенос по словам осуществляется через определение максимальной длины строки.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Решено: Информация о терминале

Сообщение Uncle_Theodore »

Если X не запущен, надо запрашивать размер консоли. Смотри тут
http://docwiki.gumstix.org/Tips_and_tricks..._serial_console
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Решено: Информация о терминале

Сообщение Liksys »

А вот такое решение насколько правильное? (ессно, проверки на ошибки будут поставлены)

Код: Выделить всё

#include <stdio.h>
#include <unistd.h>
#include <curses.h>
#include <term.h>
int main(void)
{
        tgetent(0, NULL);
        printf("%d\n", tgetnum("co"));
        return 0;
}
Только меня смущают утечки памяти даже в такой простой программе :(
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Решено: Информация о терминале

Сообщение Liksys »

Uncle_Theodore писал(а):
04.06.2007 01:03
Если X не запущен, надо запрашивать размер консоли. Смотри тут
http://docwiki.gumstix.org/Tips_and_tricks..._serial_console

Попробовал писать/читать (типа как resize) в /dev/tty1, который у меня текущая консоль. Он в нее гадит :) Ну это ясно почему, а вот как бы это пофиксить?
Спасибо сказали:
Аватара пользователя
halturin
Сообщения: 167
ОС: Linux

Re: Решено: Информация о терминале

Сообщение halturin »

Liksys писал(а):
04.06.2007 01:11
А вот такое решение насколько правильное? (ессно, проверки на ошибки будут поставлены)

Код: Выделить всё

#include <stdio.h>
#include <unistd.h>
#include <curses.h>
#include <term.h>
int main(void)
{
        tgetent(0, NULL);
        printf("%d\n", tgetnum("co"));
        return 0;
}
Только меня смущают утечки памяти даже в такой простой программе :(


а где здесь утечка? в упор не вижу. :)
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: Решено: Информация о терминале

Сообщение d_n_k »

трудно найти черную кошку в темной комнате, особенно если её там нет
все сказанное есть имхо...
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Решено: Информация о терминале

Сообщение Liksys »

Ну если бы не было, то не писал бы ;)
[liksys@max ~]$ valgrind ./test
==3143== Memcheck, a memory error detector.
==3143== Copyright © 2002-2006, and GNU GPL'd, by Julian Seward et al.
==3143== Using LibVEX rev 1658, a library for dynamic binary translation.
==3143== Copyright © 2004-2006, and GNU GPL'd, by OpenWorks LLP.
==3143== Using valgrind-3.2.1, a dynamic binary instrumentation framework.
==3143== Copyright © 2000-2006, and GNU GPL'd, by Julian Seward et al.
==3143== For more details, rerun with: -v
==3143==
141
==3143==
==3143== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 14 from 1)
==3143== malloc/free: in use at exit: 3,688 bytes in 12 blocks.
==3143== malloc/free: 20 allocs, 8 frees, 5,509 bytes allocated.
==3143== For counts of detected errors, rerun with: -v
==3143== searching for pointers to 12 not-freed blocks.
==3143== checked 96,416 bytes.
==3143==
==3143== LEAK SUMMARY:
==3143== definitely lost: 0 bytes in 0 blocks.
==3143== possibly lost: 0 bytes in 0 blocks.
==3143== still reachable: 3,688 bytes in 12 blocks.
==3143== suppressed: 0 bytes in 0 blocks.
==3143== Reachable blocks (those to which a pointer was found) are not shown.
==3143== To see them, rerun with: --show-reachable=yes
Спасибо сказали:
Аватара пользователя
sarutobi
Сообщения: 676
Статус: Добрость и скромнота
ОС: Debian 5, FreeBSD 6.2/8.0

Re: Решено: Информация о терминале

Сообщение sarutobi »

Liksys,
valgrind --leak-check=full ./test не спасет отца русской демократии? ;)
Fire and water, earth and sky - mistery surrounds us, legends never die!
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Решено: Информация о терминале

Сообщение Liksys »

Код:

[liksys@max ~]$ valgrind --leak-check=full --show-reachable=yes ./test ==5827== Memcheck, a memory error detector. ==5827== Copyright © 2002-2006, and GNU GPL'd, by Julian Seward et al. ==5827== Using LibVEX rev 1658, a library for dynamic binary translation. ==5827== Copyright © 2004-2006, and GNU GPL'd, by OpenWorks LLP. ==5827== Using valgrind-3.2.1, a dynamic binary instrumentation framework. ==5827== Copyright © 2000-2006, and GNU GPL'd, by Julian Seward et al. ==5827== For more details, rerun with: -v ==5827== 141 ==5827== ==5827== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 14 from 1) ==5827== malloc/free: in use at exit: 3,688 bytes in 12 blocks. ==5827== malloc/free: 20 allocs, 8 frees, 5,509 bytes allocated. ==5827== For counts of detected errors, rerun with: -v ==5827== searching for pointers to 12 not-freed blocks. ==5827== checked 96,416 bytes. ==5827== ==5827== 14 bytes in 2 blocks are still reachable in loss record 1 of 8 ==5827== at 0x4005400: malloc (vg_replace_malloc.c:149) ==5827== by 0x487BF01F: strdup (in /lib/libc-2.5.so) ==5827== by 0x48194F21: _nc_setupterm (in /usr/lib/libncurses.so.5.5) ==5827== by 0x48195837: tgetent (in /usr/lib/libncurses.so.5.5) ==5827== by 0x80484A8: main (in /home/liksys/test) ==5827== ==5827== ==5827== 25 bytes in 1 blocks are still reachable in loss record 2 of 8 ==5827== at 0x4005400: malloc (vg_replace_malloc.c:149) ==5827== by 0x48192EBE: _nc_home_terminfo (in /usr/lib/libncurses.so.5.5) ==5827== by 0x4819A539: _nc_next_db (in /usr/lib/libncurses.so.5.5) ==5827== by 0x4819B021: _nc_read_entry (in /usr/lib/libncurses.so.5.5) ==5827== by 0x481950CC: _nc_setupterm (in /usr/lib/libncurses.so.5.5) ==5827== by 0x48195837: tgetent (in /usr/lib/libncurses.so.5.5) ==5827== by 0x80484A8: main (in /home/liksys/test) ==5827== ==5827== ==5827== 48 bytes in 1 blocks are still reachable in loss record 3 of 8 ==5827== at 0x400473F: calloc (vg_replace_malloc.c:279) ==5827== by 0x4819AD13: _nc_read_file_entry (in /usr/lib/libncurses.so.5.5) ==5827== by 0x4819B094: _nc_read_entry (in /usr/lib/libncurses.so.5.5) ==5827== by 0x481950CC: _nc_setupterm (in /usr/lib/libncurses.so.5.5) ==5827== by 0x48195837: tgetent (in /usr/lib/libncurses.so.5.5) ==5827== by 0x80484A8: main (in /home/liksys/test) ==5827== ==5827== ==5827== 83 bytes in 1 blocks are still reachable in loss record 4 of 8 ==5827== at 0x4005400: malloc (vg_replace_malloc.c:149) ==5827== by 0x48192CEC: _nc_doalloc (in /usr/lib/libncurses.so.5.5) ==5827== by 0x4819631E: _nc_tparm_analyze (in /usr/lib/libncurses.so.5.5) ==5827== by 0x48196481: tparm (in /usr/lib/libncurses.so.5.5) ==5827== by 0x4819B616: (within /usr/lib/libncurses.so.5.5) ==5827== by 0x4819B91B: _nc_trim_sgr0 (in /usr/lib/libncurses.so.5.5) ==5827== by 0x481959AE: tgetent (in /usr/lib/libncurses.so.5.5) ==5827== by 0x80484A8: main (in /home/liksys/test) ==5827== ==5827== ==5827== 128 bytes in 1 blocks are still reachable in loss record 5 of 8 ==5827== at 0x4005400: malloc (vg_replace_malloc.c:149) ==5827== by 0x4819AF5D: _nc_read_file_entry (in /usr/lib/libncurses.so.5.5) ==5827== by 0x4819B094: _nc_read_entry (in /usr/lib/libncurses.so.5.5) ==5827== by 0x481950CC: _nc_setupterm (in /usr/lib/libncurses.so.5.5) ==5827== by 0x48195837: tgetent (in /usr/lib/libncurses.so.5.5) ==5827== by 0x80484A8: main (in /home/liksys/test) ==5827== ==5827== ==5827== 172 bytes in 1 blocks are still reachable in loss record 6 of 8 ==5827== at 0x400473F: calloc (vg_replace_malloc.c:279) ==5827== by 0x48194D76: _nc_setupterm (in /usr/lib/libncurses.so.5.5) ==5827== by 0x48195837: tgetent (in /usr/lib/libncurses.so.5.5) ==5827== by 0x80484A8: main (in /home/liksys/test) ==5827== ==5827== ==5827== 1,381 bytes in 1 blocks are still reachable in loss record 7 of 8 ==5827== at 0x4005400: malloc (vg_replace_malloc.c:149) ==5827== by 0x4819A756: _nc_read_file_entry (in /usr/lib/libncurses.so.5.5) ==5827== by 0x4819B094: _nc_read_entry (in /usr/lib/libncurses.so.5.5) ==5827== by 0x481950CC: _nc_setupterm (in /usr/lib/libncurses.so.5.5) ==5827== by 0x48195837: tgetent (in /usr/lib/libncurses.so.5.5) ==5827== by 0x80484A8: main (in /home/liksys/test) ==5827== ==5827== ==5827== 1,837 bytes in 4 blocks are still reachable in loss record 8 of 8 ==5827== at 0x40054FB: realloc (vg_replace_malloc.c:306) ==5827== by 0x48192CCF: _nc_doalloc (in /usr/lib/libncurses.so.5.5) ==5827== by 0x4819ABEA: _nc_read_file_entry (in /usr/lib/libncurses.so.5.5) ==5827== by 0x4819B094: _nc_read_entry (in /usr/lib/libncurses.so.5.5) ==5827== by 0x481950CC: _nc_setupterm (in /usr/lib/libncurses.so.5.5) ==5827== by 0x48195837: tgetent (in /usr/lib/libncurses.so.5.5) ==5827== by 0x80484A8: main (in /home/liksys/test) ==5827== ==5827== LEAK SUMMARY: ==5827== definitely lost: 0 bytes in 0 blocks. ==5827== possibly lost: 0 bytes in 0 blocks. ==5827== still reachable: 3,688 bytes in 12 blocks. ==5827== suppressed: 0 bytes in 0 blocks. [liksys@max ~]$
Походу утечки в curses...
Спасибо сказали:
RyMiS
Сообщения: 9
ОС: GNU/Linux

Re: Решено: Информация о терминале

Сообщение RyMiS »

Liksys писал(а):
03.06.2007 21:42
В общем, как получить информацию о параметрах терминала? Нужен по большей части только параметр с максимальной длиной строки.
Делать getenv("COLUMNS") не предлагать, этот вариант не всегда работает, а только когда переменная експортирована. Очевидно, есть какой-то более правильный способ. Программа запускается в консоли (виртуале, xterm, konsole, etc.), необходимо, чтобы она подстраивалась под длину строки.
Как осуществляется? В поиск, пожалуйста, не посылать, кроме terminfo и termcap ниче не нашел, да и это наверно не совсем то.
Если можно, подкиньте пример.


Вот как это делается у меня:

Код: Выделить всё

static int get_term_width()
{
        char * str = getenv("COLUMNS");
        int rv;
#if HAVE_SYS_IOCTL_H && !defined(WIN32)
        struct winsize ws;
#endif

        if (str) {
                rv = atoi(str);
                if (rv > 20) return rv;
        }

#if HAVE_SYS_IOCTL_H && !defined(WIN32)
        if (ioctl(1, TIOCGWINSZ, &ws)<0) {
                return 80;
        }
        return ws.ws_col;
#endif

        return 80;
}


Работает корректно в Linux/FreeBSD/Solaris/Darwin/Win32. Больше нигде не пробовал :)
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Решено: Информация о терминале

Сообщение Liksys »

У меня в данный момент что-то в этом духе

Код: Выделить всё

static int init_max_terminal_line_len(void)
{
        //////////////////////////////////////////
        char    *max_terminal_line_len_str;     // Strokovaya velichina dliny
        extern settings_t settings;             // Nastroyki sistemy
        //////////////////////////////////////////


        // Bez kommentariev :)
        if ( (max_terminal_line_len_str = getenv("COLUMNS")) == NULL )
        {
                fprintf(stderr, "%s: cannot get \"$COLUMNS\" value: %s\n",
                        MYNAME, strerror(errno) );
                settings.max_terminal_line_len = DEFAULT_MAX_TERMINAL_LINE_LEN;
                return -1;
        }

        if ( (settings.max_terminal_line_len = atoi(max_terminal_line_len_str)) == 0 )
        {
                fprintf(stderr, "%s: incorrect \"COLUMNS\" value\n", MYNAME);
                settings.max_terminal_line_len = DEFAULT_MAX_TERMINAL_LINE_LEN;
                return -1;
        }

        return 0;
}
Спасибо сказали: