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() завершается ошибкой если:

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 может быть небезопасен.

СМОТРИТЕ ТАКЖЕ
fork(2), ttyname(3), pty(7)