login_tty - функции для работы с терминалом
login_tty(3)
функции для работы с терминалом
Other Alias
openpty, forkpty
ОБЗОР
#include <pty.h>
int openpty(int *amaster, int *aslave, char *name,
const struct termios *termp,
const struct winsize *winp);
pid_t forkpty(int *amaster, char *name,
const struct termios *termp,
const struct winsize *winp);
#include <utmp.h>
int login_tty(int fd);
Компонуется при указании параметра -lutil.
ОПИСАНИЕ
Функция
openpty() ищет доступный псевдотерминал и возвращает файловые
дескрипторы для его основного и подчинённого устройств в
amaster и
aslave. Если
name не равно NULL, то имя файла подчинённого устройства
возвращается в
name. Если
termp не равно NULL, то параметры терминала
подчинённого устройства будут установлены в значения, указанные в
termp. Если
winp не равно NULL, то размер окна подчинённого устройства
будет установлен согласно значениям, указанным в
winp.
Функция login_tty() подготавливает терминал fd (который может быть
реальным устройством терминала или подчинённым псевдотерминала, возвращаемым
openpty()) таким образом, чтобы через него можно было войти в систему;
для этого создаётся новый сеанс, fd делается управляющим терминалом для
вызывающего процесса (при этом fd служит в качестве стандартных ввода,
вывода и потока ошибок текущего процесса) и закрывает fd.
Функция forkpty() объединяет openpty(), fork(2) и login_tty()
для создания нового процесса, работающего в псевдотерминале. Файловый
дескриптор основной стороны псевдотерминала возвращается в amaster, имя
файла подчинённого устройства — в name, если оно не равно NULL. Аргументы
termp и winp, если они не равны NULL, будут определять атрибуты
терминала и размеры окна подчинённой стороны псевдотерминала.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Если вызов
openpty(),
login_tty() или
forkpty() завершается с
ошибкой, то возвращается -1 и
errno указывает на тип ошибки. Иначе,
openpty(),
login_tty() и дочерний процесс
forkpty() возвращают 0, и
родительский процесс
forkpty() возвращает ID дочернего процесса.
ОШИБКИ
Функция
openpty() завершается с ошибкой, если:
ENOENT
Нет доступных терминалов.
Функция login_tty() завершается с ошибкой, если ioctl(2) не сможет
установить fd управляющего терминала вызывающего процесса.
Функция forkpty() завершается с ошибкой, если завершается с ошибкой хотя
бы одна из функций openpty() или fork(2).
АТРИБУТЫ
Описание терминов данного раздела смотрите в
attributes(7).
Интерфейс Атрибут Значение
forkpty(),
openpty()
безвредность в потоках: безвредно (MT-Safe locale)
login_tty()
безвредность в потоках: небезопасно (MT-Unsafe race:ttyname)
СООТВЕТСТВИЕ СТАНДАРТАМ
Данные функции BSD есть в glibc. Они не стандартизированы в POSIX.
ЗАМЕЧАНИЯ
Модификаторы
const были добавлены в аргументы указателей на структуры
openpty() и
forkpty() в glibc 2.8.
В версиях glibc до 2.0.92, openpty() возвращает файловые дескрипторы для
псевдотерминальной пары BSD; начиная с glibc 2.0.92, сначала производится
попытка открыть псевдотерминальную пару UNIX 98, а если это не удаётся, то
происходит возвращение к открытию псевдотерминальной пары BSD.
ДЕФЕКТЫ
Невозможно определить сколько места должно быть зарезервировано для
name. Поэтому, вызов
openpty() или
forkpty() со значением
name
не равным NULL может быть небезопасен.