forkpty(3) функции для работы с терминалом

Other Alias

openpty, login_tty

ОБЗОР

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