Давным, давно, в далекой далекой... в общем,
однажды в системе 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 при ошибках.