Майкл Джонсон - Разработка приложений в среде Linux. Второе издание
- Название:Разработка приложений в среде Linux. Второе издание
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2007
- Город:Москва
- ISBN:978-5-8459-1143-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Майкл Джонсон - Разработка приложений в среде Linux. Второе издание краткое содержание
Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.
Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.
Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Ниже показан код loadhello.с
.
1: /* loadhello.с */
2:
3: #include
4: #include
5: #include
6:
7: typedef void (*hello_function) (void);
8:
9: int main(void) {
10: void * library;
11: hello_function hello;
12: const char * error;
13:
14: library = dlopen("libhello.so", RTLD_LAZY);
15: if (library == NULL) {
16: fprintf (stderr, "He удается открыть libhello.so: %s\n",
17: dlerror());
18: exit(1);
19: }
20:
21: /* Хотя в данном случае мы знаем, что символ print_hello никогда
22: * не должен быть равен NULL, при поиске произвольных символов
23: * все происходит иначе. Поэтому вместо проверки результата функции dlsym()
24: * мы показываем пример проверки кода, возвращаемого функцией dlerror().
25: */
26: dlerror();
27: hello = dlsym(library, "print_hello");
28: error = dlerror();
29: if (error) {
30: fprintf(stderr, "He удается найти print_hello: %s\n", error);
31: exit(1);
32: }
33:
34: (*hello)();
35: dlclose(library);
36: return 0;
37: }
Глава 28
Идентификация и аутентификация пользователей
В модели безопасности Linux для идентификации пользователей и групп используются числа, однако люди отдают предпочтение именам. Имена, наряду с другой важной информацией, сохраняются в двух системных базах данных.
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
(или эквивалентной базы данных системы), определена в .
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
(или в эквивалентных базах данных), определена в .
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()
, чтобы закрыть файл.
Интервал:
Закладка: