28.1. Преобразование идентификатора в имя
28.1. Преобразование идентификатора в имя
В результате выполнения команды ls -l для вывода списка содержимого текущего каталога в третьей и четвертой колонках указываются идентификаторы (ID) пользователя и группы, к которой принадлежит каждый файл. Этот список выглядит примерно следующим образом.
drwxrwxr-x 5 christid christid 1024 Aug 15 02:30 christid
drwxr-xr-x 73 johnsonm root 4096 Jan 18 12:48 johnsonm
drwxr-xr-x 25 kim root 2048 Jan 12 21:13 kim
drwxrwsr-x 2 tytso tytso 1024 Jan 30 1996 tytso
Однако нигде в ядре не хранится строка christid. Программа ls осуществляет преобразование номеров, предоставленных ядром, в имена. Она получает номера из системного вызова stat() и производит поиск имен в двух системных базах данных. Обычно эти базы данных хранятся в файлах /etc/passwd и /etc/group, хотя в некоторых системах информация может располагаться где-нибудь в сети или в каком-то другом нестандартном месте. Программистам не нужно беспокоиться о том, где хранится эта информация; библиотека С предлагает обобщённые функции, которые считывают конфигурационные файлы для определения места хранения этой информации, производят выборку информации и возвращают ее незаметно для вас.
Чтобы продемонстрировать, что программа ls получает из ядра, выполним команду ls -ln.
drwxrwxr-x 5 500 500 1024 Aug 15 02:30 christid
drwxr-xr-x 73 100 0 4096 Jan 18 12:48 johnsonm
drwxr-xr-x 25 101 0 2048 Jan 12 21:13 kim
drwxrwsr-x 2 1008 1008 1024 Jan 30 1996 tytso
Структура, представляющая элементы в /etc/passwd (или эквивалентной базы данных системы), определена в <pwd.h>.
struct passwd {
char * pw_name; /* Имя пользователя */
char * pw_passwd; /* Пароль */
__uid_t pw_uid; /* Идентификатор пользователя */
__gid_t pw_gid; /* Идентификатор группы */
char * pw_gecos; /* Настоящее имя */
char * pw_dir; /* Домашний каталог */
char * pw_shell; /* Программа shell */
};
• pw_name представляет уникальное имя пользователя.
• pw_passwd может представлять зашифрованный пароль или нечто подобное, связанное с процедурой аутентификации. Зависит от системы.
• pw_uid представляет номер (обычно уникальный), который используется в ядре для идентификации пользователя.
• pw_gid представляет главную группу, которую ядро связывает с пользователем.
• pw_gecos представляет член, зависящий от системы, который хранит информацию о пользователе. Обычно сюда включается настоящее имя пользователя; во многих системах здесь приводится список членов, разделенных запятыми, который включает номера домашних и рабочих телефонов.
• pw_dir представляет домашний каталог, связанный с пользователем. Обычные сеансы регистрации начинают работать с этим каталогом в качестве текущего каталога.
• pw_shell представляет имя командной оболочки, которая запускается в случае успешной регистрации пользователя. Сюда обычно относятся /bin/bash, /bin/tcsh, bin/zsh и так далее. Однако элементы, используемые для других целей, могут иметь другие оболочки, /bin/false применяется для элементов passwd, которые не используются для регистрации пользователей. Специализированные оболочки часто служат для целей, рассмотрение которых выходит за рамки настоящей книги.
Структура, которая представляет элементы в /etc/group (или в эквивалентных базах данных), определена в <grp.h>.
struct group {
char * gr_name; /* Имя группы */
char * gr_passwd; /* Пароль */
__gid_t gr_gid; /* Идентификатор группы */
char ** gr_mem; /* Список членов */
};
• gr_name представляет уникальное имя группы.
• gr_passwd представляет пароль (обычно неиспользуемый). К нему применимы те же требования, что и к pw_passwd, только в еще большей степени.
• gr_gid представляет номер (обычно неуникальный), который ядро использует для идентификации группы.
• gr_mem представляет список членов группы, разделенных запятыми. Это список имен пользователей, которые присваиваются этой группе на вторичной основе (см. главу 10).
Существуют две общих причины, по которым производится доступ к системным идентификационным базам данных: если ядро получает номер, а вам необходимо имя, или если какой-то пользователь или какая-то программа предоставляют вам имя, а вы должны сообщить ядру номер. Предусмотрены две функции поиска числовых идентификаторов, getpwuid() и getgrgid(), которые принимают целочисленный идентификатор и возвращают указатель на структуру, содержащую информацию из соответствующей системной базы данных. Точно так же имеются две функции, которые производят поиск имен, getpwnam() и getgrnam(), и они возвращают те же две структуры.
База данных пользователей База данных групп Номер getpwuid() getgrgid() Имя getpwnam() getgrnam()Каждая из этих функций возвращает указатели на структуры. Структуры являются статическими и перезаписываются при последующем вызове функции, поэтому если вам по какой-либо причине нужно отслуживать структуру, потребуется сделать ее копию.
Четыре вышеупомянутых функции являются, по сути, сокращениями, предлагающими наиболее часто используемые функции для доступа к системным базам данных. Функции низкого уровня, getpwent() и getgrent(), производят итерации по строкам в базе данных вместо поиска конкретной записи. Каждый раз при вызове одной из этих функций она будет считывать другой элемент из соответствующей системной базы данных, и возвращать его. После того как вы завершите чтение элементов, вызовите функцию endpwent() или endgrent(), чтобы закрыть файл.
В качестве примера далее приводится функция getpwuid(), записанная в отношении функции getpwent().
struct passwd * getpwuid(uid_t uid) {
struct passwd * pw;
while (pw = getpwent()) {
if (!pw)
/* обнаружена ошибка; * сквозной проход для обработки ошибки */
break;
if (pw->pw_uid == uid) {
endpwent();
return(pw);
}
}
endpwent();
return NULL;
}
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Использование идентификатора UID в качестве условия
Использование идентификатора UID в качестве условия Если разрабатываемый код связан с контекстом процесса, то иногда появляется возможность выполнить альтернативную реализацию не "ломая" существующий код. Это важно, если необходимо переписать важный системный вызов и
23.8. Определение идентификатора ассоциации по IP-адресу
23.8. Определение идентификатора ассоциации по IP-адресу Модифицированный клиент из раздела 23.7 использовал уведомления в качестве сигнала для получения списков адресов. Это было достаточно удобно, поскольку идентификатор ассоциации, для которой требовалось получить
5.3.2. Преобразование AudioCD
5.3.2. Преобразование AudioCD У вас завалялись обычные AudioCD и вы хотите преобразовать их в формат МРЗ? Нет ничего проще. Вставьте AudioCD-диск в устройство и откройте программу Звуковыжималка (команда меню Приложения?Аудио и видео?Копирование звуковых дисков) (рис. 5.19). Puc. 5.19. Окно
Раздел идентификатора
Раздел идентификатора Теперь поговорим о содержимом второго раздела, используемого для описания расширения.Кроме разделов идентификаторов для расширений файлов, в системе также существуют стандартные идентификаторы Windows, описывающие такие объекты, как папка, диск,
Параметры раздела идентификатора
Параметры раздела идентификатора Раздел идентификатора может содержать следующие параметры.? EditFlags — данный параметр DWORD-типа определяет различные ограничения на модификацию параметров данного расширения при помощи вкладки Типы файлов диалога Свойства папки.
Разделы ветви идентификатора
Разделы ветви идентификатора Раздел идентификатора, кроме параметров, может включать в себя и другие разделы — они определяют значок, используемый для файлов с данным расширением, текущую версию идентификатора, а также сами команды контекстного меню файла. Рассмотрим
Преобразование в поверхность
Преобразование в поверхность Команда CONVTOSURFACE преобразует объекты в поверхности. Команда вызывается из падающего меню Modify ? 3D Operations ? Convert to Sufrace.В поверхности можно преобразовать следующие объекты:• двумерные фигуры;• области;• разомкнутые полилинии с нулевой шириной,
6.2.5. Преобразование в массив
6.2.5. Преобразование в массив Когда диапазон преобразуется в массив, интерпретатор последовательно вызывает метод succ, пока не будет достигнута правая граница, и помещает каждый элемент диапазона в возвращаемый массив:r = 3..12arr = r.to_a # [3,4,5,6,7,8,9,10,11,12]Ясно, что для диапазонов
8.8. Присвоение каждому экземпляру класса уникального идентификатора
8.8. Присвоение каждому экземпляру класса уникального идентификатора ПроблемаТребуется, чтобы каждый объект класса имел уникальный идентификатор.РешениеДля отслеживания следующего доступного для использования идентификатора используйте статическую переменную-член.
Преобразование в тело
Преобразование в тело Команда CONVTOSOLID преобразует в трехмерные тела полилинии и окружности, для которых задана высота. Команда вызывается из падающего меню Modify ? 3D Operations ? Convert to Solid.В выдавленные трехмерные тела можно преобразовать следующие объекты:• полилинии с
Преобразование в поверхность
Преобразование в поверхность Команда CONVTOSURFACE преобразует объекты в поверхности. Команда вызывается из падающего меню Modify ? 3D Operations ? Convert to Sufrace.В поверхности можно преобразовать следующие объекты:• двумерные фигуры;• области;• разомкнутые полилинии с нулевой шириной,
Область действия идентификатора
Область действия идентификатора Любой используемый в программе идентификатор должен быть предварительно описан. Идентификаторы описываются в разделе описаний. Идентификаторы для переменных могут также описываться внутри блока.Основная программа, подпрограмма, блок,