table of contents
TTYSLOT(3) | Руководство программиста Linux | TTYSLOT(3) |
ИМЯ¶
ttyslot - поиск слота текущего терминала пользователя в определённом файле
ОБЗОР¶
#include <unistd.h> /* для
систем BSD и Linux */
#include <stdlib.h> /* для
систем System V */
int ttyslot(void);
Требования
макроса
тестирования
свойств
для glibc (см.
feature_test_macros(7)):
ttyslot():
_XOPEN_SOURCE && _XOPEN_SOURCE_ < 500 && _XOPEN_SOURCE_EXTENDED
ОПИСАНИЕ¶
Исходная функция ttyslot() возвращает индекс записи текущего пользователя в определённом файле.
«В каком файле?» — спросите вы. Что же, для начала обратимся к истории.
Доисторические времена¶
В UNIX V6 использовался файл /etc/ttys, который читался программой init(8) для определения того, что делать с каждым терминалом. Каждая строка содержала три символа. Первый символ мог быть '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).
СООТВЕТСТВИЕ СТАНДАРТАМ¶
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).
СМОТРИТЕ ТАКЖЕ¶
2010-09-20 | GNU |