OPENPTY(3) | Руководство программиста Linux | OPENPTY(3) |
openpty, login_tty, 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() завершается ошибкой если:
Завершается ошибкой функция 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 может быть небезопасен.
2017-09-15 | GNU |