table of contents
- bullseye-backports 4.18.1-1~bpo11+1
TTYSLOT(3) | Руководство программиста Linux | TTYSLOT(3) |
ИМЯ¶
ttyslot - поиск слота текущего терминала пользователя в определённом файле
СИНТАКСИС¶
#include <unistd.h> /* смотрите ЗАМЕЧАНИЯ */
int ttyslot(void);
ttyslot():
_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).
СМ. ТАКЖЕ¶
ЗАМЕЧАНИЯ¶
Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.
ПЕРЕВОД¶
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
15 сентября 2017 г. | GNU |