ttyslot(3) поиск слота текущего терминала пользователя в определённом файле

ОБЗОР

#include <unistd.h> /* для систем BSD и Linux */
#include <stdlib.h> /* для систем System V */

int ttyslot(void);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

ttyslot():

_BSD_SOURCE ||
_XOPEN_SOURCE && _XOPEN_SOURCE_ < 500 && _XOPEN_SOURCE_EXTENDED

ОПИСАНИЕ

Исходная функция ttyslot() возвращает индекс записи текущего пользователя в определённом файле.

«В каком файле?» --- спросите вы. Что же, для начала обратимся к истории.

Доисторические времена

В UNIX V6 использовался файл /etc/ttys, который читался программой init(1) для определения того, что делать с каждым терминалом. Каждая строка содержала три символа. Первый символ мог быть '0' или '1' (где '0' означало «ignore»). Второй символ обозначал терминал: '8' означал «/dev/tty8». Третий символ был аргументом для getty(8), обозначающим начальную скорость передачи символов (например, '-' означал начинать с 110 бод). Обычная строка в файле, таким образом, имела вид «18-». Зависание какого-либо терминала обычно решалось изменением '1' на '0', подачей сигнала в init, возвращением исходного значения и ещё одной подачей сигнала в init.

В UNIX V7 формат изменился. Второй символ стал аргументом getty(8) для определения последовательного перебора скоростей ('0' означал цикл 300-1200-150-110 бод; '4' предназначался для онлайн-консоли DECwriter), а оставшиеся символы содержали имя tty. Таким образом, обычная строка была «14console».

В последующих системах синтаксис был ещё разнообразней. В системах, основанных на System V, использовался /etc/inittab.

Доисторические времена (2)

С другой стороны, существовал файл /etc/utmp, в котором перечислены люди, вошедшие в систему. Этот файл управлялся с помощью login(1). Он имел фиксированную длину, а соответствующий индекс в файле определялся login(1) с помощью вызова ttyslot() и нахождения номера строки в /etc/ttys (начиная с 1).

Семантика ttyslot

Таким образом, функция ttyslot() возвращает из файла /etc/ttys индекс управляющего терминала вызывающего процесса, который является таким же (обычно), что и индекс записи текущего пользователя в файле /etc/utmp. В BSD файл /etc/ttys все ещё был, однако в System V его уже не было, и из-за этого на него невозможно было ссылаться. Поэтому в подобных системах в документации указано, что ttyslot() возвращает индекс текущего пользователя на основании базы данных пользователей.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении данная функция возвращает номер слота. В случает ошибки (то есть, когда ни один из файловых дескрипторов 0, 1 и 2 не связан с терминалом из базы данных) возвращается 0 (для систем UNIX V6, V7 и BSD) или -1 (для систем System V).

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).
ИнтерфейсАтрибутЗначение
ttyslot() безвредность в нитяхнебезопасно (MT-Unsafe)

СООТВЕТСТВИЕ СТАНДАРТАМ

SUSv1; в SUSv2 отмечена как УСТАРЕВШАЯ; удалена в POSIX.1-2001. SUSv2 требует возврата -1 в случае ошибки.

ЗАМЕЧАНИЯ

Файл utmp в различных системах может находиться в различных местах: /etc/utmp, /var/adm/utmp, /var/run/utmp.

Реализация этой функции в glibc2 читает файл _PATH_TTYS, определённый в <ttyent.h> как «/etc/ttys». В случае ошибки она возвращает 0. Так как в системах Linux файла «/etc/ttys» обычно нет, то она всегда возвращает 0.

В Minix также есть fttyslot(fd).