Provided by: manpages-ru-dev_4.18.1-1_all bug

ИМЯ

       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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если вы обнаружите ошибки в переводе  этой  страницы  руководства,  пожалуйста,  отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.