ОБЗОР
#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).