Основы программирования в Linux - Страница 74
В исходном коде Linux вы сможете найти в команде
idgetuidДля просмотра всех данных файла учетных записей пользователей можно воспользоваться функцией
getpwent#include <pwd.h>#include <sys/types.h>void endpwent(void);struct passwd *getpwent(void);void setpwent(void);Функция
getpwentendpwentsetpwentgetpwentopendirreaddirclosedirИдентификаторы пользователя и группы (эффективный или действующий и реальный) можно получить с помощью других реже используемых функций:
#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);Подробную информацию об идентификаторах группы и эффективных идентификаторах пользователей следует искать на страницах интерактивного справочного руководства системы, хотя, быть может, вы решите, что вам вообще не следует манипулировать ими.
Только суперпользователь может вызывать функции
setuidsetgidИнформация о компьютере
Программа может установить некоторые подробные сведения о компьютере, на котором выполняется, так же, как она определяет информацию о пользователе. Подобную информацию предоставляет команда
unameman 2 unameСведения о рабочем компьютере могут оказаться полезными в ряде ситуаций. Вы можете захотеть настроить поведение программы в зависимости от сетевого имени машины, на которой она выполняется, скажем, на студенческом компьютере или машине администратора. Для соблюдения лицензионных соглашений вам может потребоваться ограничить выполнение программы одной машиной. Все это означает, что вам нужен способ определения компьютера, на котором выполняется программа.
Если в системе установлены сетевые компоненты, вы очень легко можете получить сетевое имя компьютера с помощью функции
gethostname#include <unistd.h>int gethostname(char *name, size_t namelen);Эта функция записывает сетевое имя машины в строку
namenamelengethostnameБолее подробную информацию о рабочем компьютере можно получить с помощью системного вызова
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[] | Аппаратный тип |
В случае успешного завершения функция
unameerrnoВыполните упражнение 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);