TTYSLOT(3)

ИМЯ
ttyslot - поиск слота текущего терминала пользователя в определённом файле

ОБЗОР
#include <unistd.h> /* смотрите ЗАМЕЧАНИЯ */

int ttyslot(void);

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

ttyslot():
    Начиная с glibc 2.24:
        _DEFAULT_SOURCE
    Начиная с glibc 2.20 по 2.23:
        _DEFAULT_SOURCE ||
        _XOPEN_SOURCE && _XOPEN_SOURCE < 500
    В Glibc 2.19 и старее:
        _BSD_SOURCE ||
        _XOPEN_SOURCE && _XOPEN_SOURCE < 500

ОПИСАНИЕ
Исходная функция 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.

В BSD-подобных системах и Linux объявление ttyslot() находится в файле <unistd.h>. В System V-подобных системах объявление находится в файле <stdlib.h>. Начиная с glibc 2.24 в <stdlib.h> также поместили это объявление под следующий макрос тестирования свойств:

    (_XOPEN_SOURCE >= 500 ||
            (_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED))
        && ! (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600)

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

СМОТРИТЕ ТАКЖЕ
getttyent(3), ttyname(3), utmp(5)