Основы программирования в Linux - Нейл Мэтью
Шрифт:
Интервал:
Закладка:
В исходном коде Linux вы сможете найти в команде id еще один пример-использования функции getuid.
Для просмотра всех данных файла учетных записей пользователей можно воспользоваться функцией getpwent. Она последовательно выбирает строки файла.
#include <pwd.h>
#include <sys/types.h>
void endpwent(void);
struct passwd *getpwent(void);
void setpwent(void);
Функция getpwent возвращает поочередно информацию о каждом пользователе. Когда не остается ни одного, она возвращает пустой указатель. Для прекращения обработки файла, когда просмотрено достаточно элементов, вы можете применить функцию endpwent. Функция setpwent переустанавливает позицию указателя в файле учетных записей пользователей для начала нового просмотра при следующем вызове функции getpwent. Эти функции действуют так же, как функции просмотра каталога opendir, readdir и closedir, обсуждавшиеся в главе 3.
Идентификаторы пользователя и группы (эффективный или действующий и реальный) можно получить с помощью других реже используемых функций:
#include <sys/types.h>
#include <unistd.h>
uid_t geteuid(void);
gid_t getgid(void);
gid_t getegid(void);
int setuid(uid_t uid);
int setgid(gid_t gid);
Подробную информацию об идентификаторах группы и эффективных идентификаторах пользователей следует искать на страницах интерактивного справочного руководства системы, хотя, быть может, вы решите, что вам вообще не следует манипулировать ими.
ПримечаниеТолько суперпользователь может вызывать функции setuid и setgid.
Информация о компьютере
Программа может установить некоторые подробные сведения о компьютере, на котором выполняется, так же, как она определяет информацию о пользователе. Подобную информацию предоставляет команда uname, в программе на языке С можно использовать для получения этих данных одноименный системный вызов — прочтите о нем в разделе системных вызовов интерактивного справочного руководства (раздел 2) с помощью команды man 2 uname.
Сведения о рабочем компьютере могут оказаться полезными в ряде ситуаций. Вы можете захотеть настроить поведение программы в зависимости от сетевого имени машины, на которой она выполняется, скажем, на студенческом компьютере или машине администратора. Для соблюдения лицензионных соглашений вам может потребоваться ограничить выполнение программы одной машиной. Все это означает, что вам нужен способ определения компьютера, на котором выполняется программа.
Если в системе установлены сетевые компоненты, вы очень легко можете получить сетевое имя компьютера с помощью функции gethostname:
#include <unistd.h>
int gethostname(char *name, size_t namelen);
Эта функция записывает сетевое имя машины в строку name. Предполагается, что длина строки, как минимум, namelen символов. Функция gethostname возвращает 0 в случае успешного завершения и -1 в противном случае.
Более подробную информацию о рабочем компьютере можно получить с помощью системного вызова uname.
#include <sys/utsname.h>
int uname(struct utsname *name);
Функция uname записывает информацию о компьютере в структуру, на которую указывает параметр name. Структура типа utsname, определенная в файле sys/utsname.h, обязательно должна включать элементы, перечисленные в табл. 4.5.
Таблица 4.5
Элемент структуры utsname Описание char sysname[] Имя операционной системы char nodename[] Имя компьютера char release[] Номер выпуска (релиза) системы char version[] Номер версии системы char machine[] Аппаратный типВ случае успешного завершения функция uname возвращает неотрицательное целое и в противном случае с установленной переменной errno для обозначения любой возникшей ошибки.
Выполните упражнение 4.12.
Упражнение 4.12. Информации о компьютереДалее приведена программа hostget.c, извлекающая некоторые сведения о рабочем компьютере.
#include <sys/utsname.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
char computer[256];
struct utsname uts;
if (gethostname(computer, 255) != 0 || uname(&uts) < 0) {
fprintf(stderr, "Could not get host informationn");
exit(1);
}
printf("Computer host name is %sn", computer);
printf("System is %s on %s hardwaren", uts.sysname, uts.machine);
printf("Nodename is %sn", uts.nodename);
printf("Version is %s, %sn", uts.release, uts.version);
exit(0);
}
Она отобразит следующие зависящие от ОС Linux данные. Если ваша машина включена в сеть, то вы увидите расширенное имя компьютера, включающее обозначение сети:
$ ./hostget
Computer host name is suse103
System is Linux on i686 hardware
Nodename is suse103
Version is 2.6.20.2-2-default, #1 SMP Fri Mar 9 21:54:10 UTC 2007
Как это работает
Эта программа вызывает функцию gethostname для получения имени рабочего компьютера. В приведенном примере это имя — suse103. Более подробную информацию об этом компьютере на базе Intel Pentium 4 с ОС Linux возвращает системный вызов uname. Учтите, что формат возвращаемых строк зависит от реализации, например, строка с версией системы содержит дату компиляции ядра.
ПримечаниеДругой пример применения функции uname вы можете найти в исходном коде Linux для команды uname, которая использует эту функцию.
Уникальный идентификатор каждого рабочего компьютера можно получить с помощью функции gethostid.
#include <unistd.h>
long gethostid(void);
Функция gethostid предназначена для возврата уникального значения, характеризующего рабочий компьютер. Менеджеры, следящие за соблюдением лицензионных соглашений, применяют ее для того, чтобы обеспечить функционирование программного обеспечения только на машинах с действующими лицензиями. На рабочих станциях Sun она возвращает номер, установленный в постоянной памяти во время изготовления компьютера и, таким образом, уникальный для системного оборудования. Другие системы, например Linux, возвращают значение на базе интернет-адреса машины, обычно не слишком безопасного для проверки лицензионных прав.
Ведение системных журналов
Многие приложения нуждаются в регистрации своей деятельности. Системные программы очень часто выводят сообщения на консоль или записывают их в регистрационный системный журнал. В этих сообщениях могут регистрироваться ошибки, предупреждения или более общая информация о состоянии системы. Например, программа su может зафиксировать тот факт, что пользователь пытался получить привилегии супер пользователя и потерпел неудачу.
Очень часто зарегистрированные сообщения записываются в системные файлы в каталоге, предоставляемом для этой цели. Это может быть каталог /usr/admor/var/log. При типичной установке ОС Linux все системные сообщения содержатся в файле /var/log/messages, в файл /var/log/mail включены другие регистрируемые сообщения от почтовой системы, а в файле /var/log/debug могут храниться отладочные сообщения. Проверить конфигурацию своей системы можно в файле /etc/syslog.conf или /etc/syslog-ng/syslog-ng.conf в зависимости от версии Linux.
Далее приведены некоторые примеры зарегистрированных сообщений.
Mar 2 6 18:25:51 suse103 ifstatus: eth0 device: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)
Mar 26 18:25:51 suse103 ifstatus: eth0 configuration: eth-id-00:0c:29:0e:91:72
...
May 20 06:56:56 suse103 SuSEfirewall2: Setting up rules from /etc/sysconfig/SuSEfirewall2
...
May 20 06:56:57 suse103 SuSEfirewall2: batch committing
...
May 20 06:56:57 suse103 SuSEfirewall2: Firewall rules successfully set
...
Jun 9 09:11:14 suse103 su: (to root) neil on /dev/pts/18 09:50:35
В этом выводе показаны виды регистрируемых сообщений. Несколько первых отправлены непосредственно ядром Linux во время его загрузки и обнаружения установленного оборудования. Брандмауэр сообщает о своей перенастройке. И наконец, программа su извещает о том, что доступ с учетной записью суперпользователя получен пользователем neil.
ПримечаниеДля просмотра регистрируемых сообщений вы можете запросить права суперпользователя.
Некоторые системы UNIX не предоставляют файлов с удобными для чтения сообщениями, но они снабжают администраторов средствами для чтения базы данных системных событий. См. подробности в системной документации.