Provided by: manpages-ru-dev_4.21.0-2_all 

ИМЯ
getlogin, getlogin_r, cuserid - возвращает имя пользователя
LIBRARY
Standard C library (libc, -lc)
СИНТАКСИС
#include <unistd.h>
char *getlogin(void);
int getlogin_r(char buf[.bufsize], size_t bufsize);
#include <stdio.h>
char *cuserid(char *string);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
getlogin_r():
_POSIX_C_SOURCE >= 199506L
cuserid():
Since glibc 2.24:
(_XOPEN_SOURCE && ! (_POSIX_C_SOURCE >= 200112L)
|| _GNU_SOURCE
Up to and including glibc 2.23:
_XOPEN_SOURCE
ОПИСАНИЕ
Функция getlogin() возвращает указатель на строку, содержащую имя пользователя, вошедшего в систему c
терминала, который является управляющим для процесса, или указатель null, если эта информация не может
быть получена. Строка выделяется статически и может быть перезаписана при последующих вызовах этой
функции или cuserid().
Функция getlogin_r() возвращает то же имя пользователя, но в массиве buf размером bufsize.
Функция cuserid() возвращает указатель на строку, содержащую имя пользователя, связанное с
идентификатором эффективного пользователя процесса. Если string не равно указателю null, то значение
должно быть массивом, который способен вместить как минимум L_cuserid символов; строка возвращается в
этом массиве. В противном случае возвращается указатель на строку в фиксированной области. Эта строка
выделена статически и может быть перезаписана при последующих вызовах этой функции или функции
getlogin().
Макрос L_cuserid является целочисленной константой, показывающей длину массива, который может
понадобиться для хранения имени пользователя. L_cuserid описан в <stdio.h>.
Эти функции позволяют программе точно определить работающего пользователя (cuserid()) или пользователя
этого сеанса (getlogin()) (значения могут различаться, если у программы установлен бит set-user-ID).
В большинстве случаев для определения пользователя полезнее использовать переменную окружения LOGNAME,
потому что пользователь может установить LOGNAME каким угодно.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
getlogin() returns a pointer to the username when successful, and NULL on failure, with errno set to
indicate the error. getlogin_r() returns 0 when successful, and nonzero on failure.
ОШИБКИ
В POSIX определены:
EMFILE Было достигнуто ограничение по количеству открытых файловых дескрипторов на процесс.
ENFILE Достигнуто максимальное количество открытых файлов в системе.
ENXIO У вызывающего процесса нет управляющего терминала.
ERANGE (getlogin_r) The length of the username, including the terminating null byte ('\0'), is larger
than bufsize.
В Linux/glibc также есть:
ENOENT Нет соответствующей записи в файле utmp.
ENOMEM Недостаточно памяти для выделения под структуру passwd.
ENOTTY Стандартный ввод не ссылается на терминал (смотрите ДЕФЕКТЫ).
ФАЙЛЫ
/etc/passwd
файл, содержащий базу паролей
/var/run/utmp
(обычно, /etc/utmp; в некоторых версиях libc используется /var/adm/utmp)
АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
┌──────────────┬──────────────────────┬─────────────────────────────────────────────────────────────────┐
│ Интерфейс │ Атрибут │ Значение │
├──────────────┼──────────────────────┼─────────────────────────────────────────────────────────────────┤
│ getlogin() │ Безвредность в нитях │ MT-Unsafe race:getlogin race:utent sig:ALRM timer locale │
├──────────────┼──────────────────────┼─────────────────────────────────────────────────────────────────┤
│ getlogin_r() │ Безвредность в нитях │ MT-Unsafe race:utent sig:ALRM timer locale │
├──────────────┼──────────────────────┼─────────────────────────────────────────────────────────────────┤
│ cuserid() │ Безвредность в нитях │ MT-Unsafe race:cuserid/!string locale │
└──────────────┴──────────────────────┴─────────────────────────────────────────────────────────────────┘
В приведённой выше таблице utent в race:utent означает, что если любая из функций setutent(3),
getutent(3) или endutent(3) используется одновременно в нескольких нитях программы, то может возникнуть
состязательность по данным. Эти функции вызываются из getlogin() и getlogin_r() поэтому мы используем
race:utent для напоминания.
СТАНДАРТЫ
getlogin() и getlogin_r(): POSIX.1-2001, POSIX.1-2008.
В System V имеется функция cuserid(), использующая идентификатор реального пользователя вместо
идентификатора эффективного пользователя. Функция cuserid() была включена в версию POSIX 1988 года, но
удалена из версии 1990 года. Она имеется в SUSv2, но удалена из POSIX.1-2001.
В OpenBSD имеются getlogin() и setlogin(), а имя пользователя связывается с сеансом даже если не имеется
управляющего терминала.
ДЕФЕКТЫ
К сожалению, зачастую довольно просто «обмануть» getlogin(). Иногда она вообще не работает из-за того,
что какая-то программа испортила содержимое файла utmp. Часто функция возвращает только первые 8 символов
имени. Пользователь, вошедший в систему с терминала, который является управляющим для нашей программы,
необязательно будет пользователем, запустившим программу. Избегайте использования getlogin() из
соображений безопасности.
Заметим, что glibc не следует спецификации POSIX и использует stdin вместо /dev/tty. Дефект ( в других
современных системах, например SunOS 5.8, HP-UX 11.11 и FreeBSD 4.8, также возвращают имя пользователя
если было перенаправление stdin).
Никто точно не знает что делает cuserid(), поэтому не используйте её в переносимых программах. Вместо неё
используйте getpwuid(geteuid()), если это необходимо. Не используйте cuserid().
СМ. ТАКЖЕ
logname(1), geteuid(2), getuid(2), utmp(5)
ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry
Bolkhovskikh <d20052005@yandex.ru>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov
<yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3
или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо
на man-pages-ru-talks@lists.sourceforge.net.
Linux man-pages 6.03 5 февраля 2023 г. getlogin(3)