Руководство программиста для Linux

         

Ввод/вывод с терминала


Так же, как для сигналов, управление вводом/выводом имеет 3 различных реализации: под SVR4, BSD и POSIX.1.

SVR4 работает со структурой termio и различными вызовами ioctl (такими, как TCSETA, TCGETA и т.д.) для получения и установки параметров терминала. Эта структура выглядит так: struct termio {

unsigned short c_iflag; /* режимы ввода */ unsigned short c_oflag; /* режимы вывода */ unsigned short c_cflag; /* режимы управления */ unsigned short c_lflag; /* режимы упорядочения линий */ char c_line /* упорядочение линий */ unsigned char c_cc[NCC]; /* символы управления */ };

В BSD вызовы ioctl типа TIOCGETP, TIOCSETP и т.д. работают со структурой sgtty.

В POSIX-е используется структура termios вместе с различными функциями POSIX.1, такими как tcsetattr и tcgetattr. Структура termios соответствует структуре termio в SVR4, но типы переименованы (например, tcflag_t вместо unsigned short), и для размера массива c_cc употребляется NCCS.

Под Linux-ом ядром поддерживается и termios POSIX.1, и termio SVR4. Это означает, что, если ваша программа использует оба метода доступа к вводу/выводу на терминал, то ее следует компилировать прямо под Linux-ом. Если вы в чем-то сомневаетесь, то вам понадобится совсем немного знания обоих методов, чтобы исправить termio на termios. Будем, однако, надеяться, что это не потребуется. Обратите внимание на то, пытается ли программа использовать поле c_line структуры termio. Практически для всех приложений оно должно быть равно N_TTY, и если программа предполагает возможность другого упорядочения линий, вы можете заработать ошибку.

Если ваша программа использует реализацию BSD sgtty, вы можете прилинковать libbsd, как описывалось выше. Это обеспечит перекройку ioctl, означающую пересмотр запросов ввода/вывода на терминал в термины структуры termios POSIX-а, поддерживаемые ядром. При компиляции такой программы, если символы вроде TIOCGETP не определены, вам придется прилинковать libbsd.



Содержание раздела