Чтение онлайн

ЖАНРЫ

Программирование для Linux. Профессиональный подход

Самьюэл Алекс

Шрифт:

 sigaction(SIGVTALRM, &sa, NULL);

 /* Таймер сработает через 250 миллисекунд... */

 timer.it_value.tv_sec = 0;

 timer.it_value.tv_usec = 250000;

 /* ... и будет продолжать активизироваться каждые 250

миллисекунд. */

 timer.it_interval.tv_sec = 0;

 timer.it_interval.tv_usec = 250000;

 /* Запуск виртуального таймера. Он подсчитывает фактическое

время работы процесса. */

 setitimer(ITIMER_VIRTUAL, &timer, NULL);

 /*
Переход в бесконечный цикл. */

 while (1);

}

8.14. Функция sysinfo: получение системной статистики

Функция

sysinfo
возвращает системную статистике. Ее единственным аргументом является указатель на структуру типа
sysinfo
. Перечислим наиболее интересные поля этой структуры.

■ 

uptime
— время в секундах, прошедшее с момента загрузки системы;

■ 

totalram
— общий объем оперативной памяти;

■ 

freeram
— свободный объем ОЗУ;

■ 

procs
— число процессов, работающих в системе.

Для использования функции

sysinfo
требуется включить в программу файлы
<linux/kernel.h>
,
<linux/sys.h>
и
<sys/sysinfo.h>
.

Программа, приведенная в листинге 8.12, отображает статистическую информацию о текущем состоянии системы.

Листинг 8.12. (sysinfo.c) Вывод системной статистики

#include <linux/kernel.h>

#include <linux/sys.h>

#include <stdio.h>

#include <sys/sysinfo.h>

int main {

 /* Константы преобразования. */

 const long minute = 60;

 const long hour = minute * 60;

 const long day = hour * 24;

 const double megabyte = 1024 * 1024;

 /* Получение системной статистики. */

 struct sysinfo si;

 sysinfo(&si);

 /* Представление информации в понятном виде. */

 printf("system uptime : %ld days, %ld:%02ld:%021d\n",

si.uptime / day, (si.uptime % day) / hour,

(si.uptime % hour) / minute, si.uptime % minute);

 printf("total RAM : %5.1f MB\n", si.totalram / megabyte);

 printf("free RAM : %5.1f MB\n",

 si.freeram / megabyte);

 printf("process count : %d\n", si.procs);

 return 0;

}

8.15. Функция uname

Функция

uname
возвращает информацию о системе, в частности сетевое и доменное имена компьютера, а также версию операционной системы. Единственным аргументом функции является указатель на структуру типа
utsname
. Функция заполняет следующие поля этой структуры (все эти поля содержат текстовые строки).

■ 

sysname
.
Здесь содержится имя операционной системы (например,
Linux
).

■ 

release
,
version
. В этих полях указываются номера версии и модификации ядра.

■ 

machine
. Здесь приводится информация о платформе, на которой работает система. В случае Intel-совместимых компьютеров это будет либо
i386
, либо
i686
, в зависимости от процессора.

■ 

node
. Это имя компьютера.

■ 

__domain
. Это имя домена.

Функция

uname
объявлена в файле
<sys/utsname.h>
.

В листинге 8.13 показана небольшая программа, которая отображает номера версии и модификации ядра Linux, а также сообщает тип платформы.

Листинг 8.15. (print-uname.c) Вывод информации о ядре и платформе

#include <stdio.h>

#include <sys/utsname.h>

int main {

 struct utsname u;

 uname(&u);

 printf("%s release %s (version %s) on %s\n", u.sysname,

u.release, u.version, u.machine);

 return 0;

}

Глава 9

Встроенный ассемблерный код

Сегодня лишь немногие программисты используют в своей практике язык ассемблера. Языки высокого уровня, такие как С и C++, поддерживаются практически на всех архитектурах и обеспечивают достаточно высокую производительность программ. Для тех редких случаев, когда требуется встроить в программу ассемблерные инструкции, в коллекции GNU-компиляторов (GCC) предусмотрены специальные средства, учитывающие особенности конкретной архитектуры.

Встроенными ассемблерными инструкциями следует пользоваться осторожно, так как они являются системно-зависимыми. Например, программу с инструкциями архитектуры x86 не удастся скомпилировать на компьютерах PowerPC. В то же время такие инструкции позволяют напрямую обращаться к аппаратным устройствам, вследствие чего программный код выполняется чуть быстрее.

В программы, написанные на языках С и C++, ассемблерные инструкции встраиваются с помощью функции

asm
. Например, на платформе x86 команда

asm("fsin" : "=t" (answer) : "0" (angle));

является эквивалентом следующей инструкции языка C: [30]

answer = sin(angle);

Обратите внимание на то, что, в отличие от обычных ассемблерных инструкций, функция

asm
позволяет указывать входные и выходные операнды, используя синтаксис языка С.

Подробнее узнать об инструкциях архитектуры x86, используемых в настоящей главе, можно по следующим адресам:

http://developer.intel.com/design/pentiumii/manuals
и
http://www.x86-64.org/documentation
.

30

Выражение

sin(angle)
обычно преобразуется в вызов функции библиотеки
libm
, но если задать флаг
– O1
(или включить более сильную оптимизацию), компилятор gcc заменит вызов функции простой ассемблерной инструкцией
fsin
.

Поделиться с друзьями: