Книга: Основы программирования в Linux

Информация о компьютере

Информация о компьютере

Программа может установить некоторые подробные сведения о компьютере, на котором выполняется, так же, как она определяет информацию о пользователе. Подобную информацию предоставляет команда 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, возвращают значение на базе интернет-адреса машины, обычно не слишком безопасного для проверки лицензионных прав.

Оглавление книги


Генерация: 0.071. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз