16.1.1. Служебные функции терминалов

We use cookies. Read the Privacy and Cookie Policy

16.1.1. Служебные функции терминалов

Иногда невозможно узнать, соответствует ли файловый дескриптор tty. Чаще всего это связано со стандартным дескриптором выходного файла. Программы, выводящие текст на стандартные устройства, часто форматируются иначе при записи в канал, чем при отображении информации для пользователей. Например, в случае применения команды ls для получения списка файлов, она отобразит несколько колонок при простом запуске (удобнее читать человеку), но когда вы перенаправите ее вывод в другую программу, она отобразит по одному файлу в строке (удобнее читать программе). Запустите ls и ls | cat и почувствуйте разницу.

Определить, соответствует ли файловый дескриптор tty, можно с помощью функции isatty(), принимающей файловый дескриптор в качестве своего аргумента и возвращающей 1, если дескриптор соответствует tty, и 0 в противном случае.

#include <unistd.h>

int isatty(int fd);

Функция ttyname() предоставляет каноническое имя для терминала, ассоциированное с файловым дескриптором. В качестве аргумента она принимает любой файловый дескриптор, возвращая указатель в поток символов.

#include <unistd.h>

char *ttyname(int fd);

Поскольку поток символов расположен в статическом пространстве, потребуется сделать копию возвращенной строки перед повторным вызовом ttyname(); эта функция не реентерабельна. ttyname() возвращает NULL при любой ошибке, включая случай передачи файлового дескриптора, не ассоциированного с tty.