TTYSLOT(3)

НАЗВАНИЕ
ttyslot - поиск слота текущего терминала пользователя в некотором файле

СИНТАКСИС

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

int ttyslot(void);

ОПИСАНИЕ
Функция 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), а остаток строки содержал имя терминала. Поэтому типичным значением строки было "14console".

Далее системы еще больше расширили синтаксис. Системы типа SYSV вместо этого файла используют файл /etc/inittab.

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

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

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
При нормальном завершении работы эта функция возвращает номер слота. При ошибках (например, если ни один из описателей файлов 0, 1 или 2 не ассоциирован с терминалом, указанном в этой базе данных) возвращается 0 на системах Unix V6 и V7 и на BSD-подобных, но -1 на системах, подобных SYSV.

ЗАМЕЧАНИЯ
Файл utmp находится в разных местах на разных системах, например /etc/utmp, /var/adm/utmp, /var/run/utmp.

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

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

ПРИМЕЧАНИЯ ПО ИСТОРИИ
ttyslot() появилось в Unix V7.

СООТВЕТСТВИЕ СТАНДАРТАМ
XPG2. Унаследовано в SUSv2. Удалено в SUSv3. SUSv2 требует возврата -1 при ошибках.

СМ. ТАКЖЕ
getttyent(3), ttyname(3), utmp(5)