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

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

Ниже описано подмножество, используемое для интерфейсов.

dev_t
Арифметический тип данных, содержащий старшие (major) и младшие (minor) числа, соответствующие специальным файлам устройств, обычно расположенным в подкаталоге
/dev
. В Linux
dev_t
можно манипулировать с помощью макросов
major
,
minor
и
makedev
, которые определены в
<sys/sysmacros.h>
. Обычно
dev_t
используется только в системном программировании, описанном в главе 11.
uid_t
,
gid_t
Целочисленные типы, содержащие уникальные идентификаторы, соответственно, пользователя и группы. Удостоверения идентификаторов пользователя и группы рассматриваются в главе 10.
pid_t
Целочисленный тип, обеспечивающий уникальное значение для системного процесса (описан в главе 10).
id_t
Целочисленный тип, способный хранить без усечения любой
тип
pid_t
,
uid_t
или
gid_t
.
off_t
Целочисленный тип со знаком для измерения размера файла в байтах.
size_t
Целочисленный тип без знака для измерения размеров объектов в памяти, например, символьных строк, массивов или буферов.
ssize_t
Целочисленный тип со знаком для подсчета байтов (положительные значения) или хранения кода возврата ошибки (отрицательные значения).
time_t
Целочисленный тип (во всех обычных системах) или тип с плавающей точкой (позволяет рассматривать VMS как операционную систему POSIX), выдающий время в секундах, как описано в главе 18.

Типы намеренно описаны нечетко. Нет никакой гарантии, что типы будут одинаковыми на двух разных платформах Linux или даже в двух различных средах, работающих на одной и той же платформе. Скорее всего, 64-разрядная машина, поддерживающая как 64-разрядную, так и 32-разрядную среды, будет иметь разные значения для некоторых из этих типов в каждой среде.

Кроме того, в будущих версиях Linux представленные типы могут изменяться в рамках, установленных стандартом POSIX.

6.2.2. Раскрытие возможностей времени выполнения

Многие системные возможности имеют ограничения, другие являются необязательными, а некоторые могут содержать связанную с ними информацию. Ограничение на длину строки аргументов, передаваемых новой программе, защищает систему от произвольных запросов памяти, которые в ряде случаев могут вызвать крах системы. Не во всех системах POSIX реализовано управление заданиями. Любая программа может получить сведения о наиболее поздней версии стандарта POSIX, которая реализована в системе.

Функция

sysconf
выдает такой тип системной информации, которая для одного и того же исполняемого файла в различных системах может отличаться и которую невозможно узнать во время компиляции.

#include <unistd.h>

long sysconf (int);

Целочисленный аргумент в

sysconf
— это один из наборов макросов с префиксом
_SC_
. Ниже перечислены макросы, которые используются чаще всего.

_SC_CLK_TCK
Возвращает количество тактов в секунду внутренних часов ядра, различаемое программами. Следует отметить, что ядро может содержать одни или больше часов, работающих на более высокой частоте.
_SC_CLK_TCK
обеспечивает подсчет тактов, которые используются для получения информации из ядра, и этот макрос не является индикатором времени ожидания системы.
_SC_STREAM_MAX
Возвращает максимальное количество стандартных потоков ввода-вывода С, которые могут быть одновременно открыты в системе.
_SC_ARG_MAX
Возвращает максимальную длину аргумента командной строки и переменных окружения в байтах, которые используются любой из функций
exec
. Если это ограничение превышено,
exec
вернет ошибку
Е2ВIG
.
_SC_OPEN_MAX
Возвращает максимальное количество файлов, которые одновременно могут быть открыты процессом; это то же самое, что и программное ограничение
RLIMIT_NOFILE
, которое может быть запрошено функцией
getrlimit
и установлено функцией
setrlimit
. Это единственное значение
sysconf
, которое может изменяться во время выполнения программы; при вызове
setrlimit
для изменения ограничения
RLIMIT_NOFILE
.
_SC_OPEN_MAX
также подчиняется новому программному ограничению.
_SC_PAGESIZE
или
_SC_PAGE_SIZE
Возвращает размер одной страницы в байтах. В системах, которые могут поддерживать разные размеры страниц, возвращается размер одной обычной страницы, для которой выделено определенное количество памяти и которая считается естественным размером страниц для конкретной системы.
_SC_LINE_MAX
Возвращает максимальную длину в байтах входной строки, обрабатываемой текстовыми утилитами, включая завершающий символ новой строки. Следует отметить, что во многих утилитах GNU, используемых в Linux-системах, фактически нет жестко закодированной максимальной длины строки, потому могут применяться входные строки произвольной длины. Однако переносимая программа не должна вызывать текстовые утилиты для строк, длина которых превышает
_SC_LINE_MAX
; во многих Unix-системах утилиты работают с фиксированным максимальным размером строки, и его превышение может привести к неопределенным результатам.
_SC_NGROUPS_MAX
Возвращает количество дополнительных групп (см. главу 10), которые может иметь процесс.

6.2.3. Поиск и настройка базовой системной информации

Существует несколько порций полезной информации о системе, которая может понадобиться программе. Например, название и версия операционной системы могут служить для определения функциональности, предлагаемой системными программами.

Системный вызов

uname
позволяет программе обнаружить информацию времени ее выполнения.

#include <sys/utsname.h>

int uname(struct utsname* unameBuf);

В случае ошибки функция возвращает ненулевое значение, что происходит только в ситуациях, когда передается недопустимый указатель

unameBuf
. При нормальном завершении структура, на которую он указывает, заполняется строками,
завершаемыми
NULL
, которые описывают текущую систему. В табл. 6.1 представлены члены структуры
utsname
.

Таблица 6.1. Члены структуры

utsname

Член Описание
sysname
Название операционной системы (в данном случае
Linux
).
release
Номер версии выполняющегося ядра. Это полная версия вроде
2.6.2
. Номер может быть легко изменен тем, кто выполнял сборку ядра, и вполне возможно, что цифр будет больше трех. Во многих версиях можно встретить дополнительную цифру для описания примененных исправлений, например,
2.4.17-23
.
version
Под Linux здесь содержится временная метка, описывающая время, когда собиралось ядро.
machine
Короткая строка, указывающая тип микропроцессора, на котором работает операционная система. Для Pentium Pro или более мощных она может быть
i686
, для процессоров класса Alpha —
alpha
, а для 64-разрядных процессоров PowerPC —
ррс64
.
nodename
Имя хоста машины, которое обычно является первичным именем хоста в Internet.
domainname
Домен NIS (или YP), которому принадлежит машина.

Член

nodename
(имя узла) часто называется системным именем хоста (то, что отображает команда
hostname
), однако его не следует путать с именем Internet-хоста. Несмотря на то что во многих системах эти члены не различаются, путать их не стоит. В системе с множеством Internet-адресов есть множество имен Internet-хостов, но только одно имя узла, поэтому эти имена не являются эквивалентными.

Более распространенная ситуация связана с домашними компьютерами, которые используют Internet-каналы широкополосной связи. Обычно их имя хоста в Internet выглядит вроде

host127-56.raleigh.myisp.com
, а имена Internet-хостов меняются каждый раз при отключении на длительное время от модема [6] . Владельцы этих машин дают своим компьютерам имя узла, которое им больше нравится, например,
loren
или
eleanor
, что совершенно не относится к адресам Internet. При наличии множества машин, работающих на одном домашнем шлюзе, все они будут разделять один Internet-адрес (и одно имя Internet-хоста), но могут иметь имена вроде
Linux.mynetwork.org
и
freebsd.mynetwork.org
, которые все еще не являются именами Internet-хоста. В связи со всеми вышеперечисленными причинами, предполагать, что имя системного узла является допустимым именем Internet-хоста для машины не верно.

6

Большинство, но не все, поставщики услуг доступа в Internet назначают динамические IP-адреса, а не статические.

Имя узла системы устанавливается с помощью системного вызова

sethostname
[7] , и имя домена NIS (YP) [8] — посредством системного вызова
setdomainname
.

#include <unistd.h>

int sethostname(const char * name, size_t len);

int setdomainname(const char * name, size_t len);

Оба этих системных вызова принимают указатель на строку (не обязательно завершающуюся

NULL
), которая содержит подходящее имя, и целочисленный аргумент, указывающий размер строки.

7

Несмотря на имя, которое может ввести в заблуждение, этот системный вызов устанавливает имя узла, а не имя Internet-хоста машины.

8

Сетевые информационные службы (Network Information Services — NIS) предоставляют для машин в сети механизм совместного использования информации, такой как пользовательские имена и пароли. Ранее они назывались "желтыми страницами" (Yellow Pages — YP). Имя домена NIS — часть этого механизма, который реализуется за пределами ядра системы с тем исключением, что доменное имя хранится в структуре

utsname
.

6.3. Совместимость

Приложения, которые скомпилированы с заголовочными файлами из библиотеки

glibc
и привязанные к одной из ее версий, будут работать и с более поздними версиями библиотеки. Эта обратная совместимость обычно означает, что программисту не придется пересобирать свои приложения только из-за того, что выпущена новая версия
glibc
.

Существуют практические ограничения для обратной совместимости. Во-первых, смешивание объектов из разных версий

glibc
в одном исполняемом файле может иногда работать, но специально для такой совместимости ничего не предпринимается. Следует отметить, что это касается динамически загружаемых, а также статически связанных объектов. Во-вторых, приложение должно использовать только стандартные возможности
glibc
. Приложение, которое зависит от побочных эффектов ошибок или основано на неопределенном поведении одной из версий
glibc
, может не работать с более поздними версиями этой библиотеки. Приложение, компонуемое с приватными символами
glibc
(обычно они имеют префикс
а_
), также вряд ли будет работать с более новыми версиями
glibc
.

Обратная совместимость поддерживается тогда, когда задействованы символы, разработанные специально для соответствия стандартам версий. Когда разработчики

glibc
хотят внести несовместимое изменение в
glibc
, они сохраняют оригинальную реализацию или пишут совместимую реализацию данного интерфейса и помечают его более старым номером версии
glibc
. Затем они реализуют новый интерфейс (который может отличаться по семантике, сигнатуре или и тем, и другим) и помечают его новым номером версии
glibc
. Приложения, построенные на базе старой версии
glibc
, используют старый интерфейс, а приложения, построенные на основе новой версии — новый интерфейс.

Поделиться:
Популярные книги

Повелитель механического легиона. Том VI

Лисицин Евгений
6. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VI

Ваше Сиятельство 6

Моури Эрли
6. Ваше Сиятельство
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 6

Имя нам Легион. Том 5

Дорничев Дмитрий
5. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 5

Начальник милиции. Книга 4

Дамиров Рафаэль
4. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 4

Полководец поневоле

Распопов Дмитрий Викторович
3. Фараон
Фантастика:
попаданцы
5.00
рейтинг книги
Полководец поневоле

Я же бать, или Как найти мать

Юнина Наталья
Любовные романы:
современные любовные романы
6.44
рейтинг книги
Я же бать, или Как найти мать

Маршал Советского Союза. Трилогия

Ланцов Михаил Алексеевич
Маршал Советского Союза
Фантастика:
альтернативная история
8.37
рейтинг книги
Маршал Советского Союза. Трилогия

Боги, пиво и дурак. Том 4

Горина Юлия Николаевна
4. Боги, пиво и дурак
Фантастика:
фэнтези
героическая фантастика
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 4

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Возвращение Безумного Бога 3

Тесленок Кирилл Геннадьевич
3. Возвращение Безумного Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Возвращение Безумного Бога 3

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9

Темный Лекарь 7

Токсик Саша
7. Темный Лекарь
Фантастика:
попаданцы
аниме
фэнтези
5.75
рейтинг книги
Темный Лекарь 7

Александр Агренев. Трилогия

Кулаков Алексей Иванович
Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Александр Агренев. Трилогия

Курсант: Назад в СССР 13

Дамиров Рафаэль
13. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 13