getlogin, getlogin_r, cuserid -
возвращает
имя
пользователя
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);
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 <
[email protected]>, Dmitry Bolkhovskikh
<
[email protected]>, Vladislav <
[email protected]>,
Yuri Kozlov <
[email protected]> и
Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]