Выбрать главу

• системные администраторы и «продвинутые» пользователи, которые желают тщательнее изучить программный интерфейс Linux/UNIX и понять, каким образом реализованы различные части системного ПО.

Предполагается, что у вас есть какой-либо опыт программирования, при этом опыт системного программирования необязателен. Я также рассчитываю на то, что вы разбираетесь в языке программирования C и знаете, как работать в оболочке и пользоваться основными командами Linux или UNIX. Если вы впервые сталкиваетесь с Linux или UNIX, вам будет полезно прочесть главу 2 — в ней приводится обзор основных понятий Linux и UNIX, ориентированный на программиста.

Стандартным справочным руководством по языку C является книга [Kernighan & Ritchie, 1988]. В книге [Harbison & Steele, 2002] этот язык рассмотрен более подробно, а также приведены изменения, появившиеся в стандарте C99. Издание [van der Linden, 1994] дает альтернативное рассмотрение языка С, очень увлекательное и толковое. В книге [Peek et al., 2001] содержится хорошее краткое введение в работу с системой UNIX.

Linux и UNIX

Эта книга могла бы быть полностью посвящена системному программированию в стандарте UNIX (то есть POSIX), поскольку многие функции, которые можно найти в других реализациях UNIX, присутствуют также в Linux и наоборот. Тем не менее, поскольку создание портируемых приложений — одна из основных задач, важно также описать и особенности Linux, которые расширяют стандартный программный интерфейс UNIX. Одной из причин является популярность Linux. Другая причина состоит в том, что иногда необходимо применять нестандартные расширения: либо из соображений производительности, либо для достижения функциональности, недоступной в стандартном программном интерфейсе UNIX. (По этим причинам все реализации UNIX снабжены нестандартными расширениями.)

Таким образом, хотя я задумал эту книгу так, чтобы она была полезна для программистов, работающих со всеми реализациями UNIX, я также привожу полное описание программных средств, характерных для Linux. К ним относятся следующие:

• интерфейс epoll, который позволяет получать уведомления о событиях файлового ввода-вывода;

• интерфейс inotify, позволяющий отслеживать изменения файлов и каталогов;

• мандаты (возможности) (capabilities) — позволяют предоставить какому-либо процессу часть прав суперпользователя;

• расширенные атрибуты;

• флаги индексного дескриптора;

• системный вызов clone();

• файловая система /proc;

• характерные для Linux особенности реализации файлового ввода-вывода, сигналов, таймеров, потоков, совместно используемых (общих) библиотек, межпроцессного взаимодействия и сокетов.

Структура книги

Вы можете использовать эту книгу по меньшей мере двумя способами.

• В качестве вводного руководства в программный интерфейс Linux/UNIX. Можно читать книгу от начала до конца. Главы из второй половины издания основаны на материале, изложенном в главах первой половины; ссылки на более поздний материал по возможности сведены к минимуму.

• В качестве всеобъемлющего справочника по программному интерфейсу Linux/UNIX. Расширенное оглавление и обилие перекрестных ссылок позволяют читать книгу в произвольном порядке.

Главы этой книги сгруппированы следующим образом.

1. Предварительные сведения и понятия. История UNIX, языка C и Linux, а также обзор стандартов UNIX (глава 1); ориентированное на программиста описание тем, относящихся к Linux и UNIX (глава 2); фундаментальные понятия системного программирования в Linux и UNIX (глава 3).

2. Фундаментальные функции интерфейса системного программирования. Файловый ввод/вывод (главы 4 и 5); процессы (глава 6); выделение памяти (глава 7); пользователи и группы (глава 8); идентификаторы процесса (глава 9); время (глава 10); системные ограничения и возможности (глава 11); получение информации о системе и процессе (глава 12).

3. Более сложные функции интерфейса системного программирования. Буферизация файлового ввода-вывода (глава 13); файловые системы (глава 14); атрибуты файла (глава 15); расширенные атрибуты (глава 16); списки контроля доступа (глава 17); каталоги и ссылки (глава 18); отслеживание файловых событий (глава 19); сигналы (главы 20–22); таймеры (глава 23).

4. Процессы, программы и потоки. Создание процесса, прекращение процесса, отслеживание дочерних процессов и выполнение программ (главы 24–28); потоки POSIX (главы 29–33).

5. Более сложные темы, относящиеся к процессам и программам. Группы процессов, сессии и управление задачами (глава 34); приоритет процессов и диспетчеризация (глава 35); ресурсы процессов (глава 36); демоны (глава 37); написание программ, привилегированных в плане безопасности (глава 38); возможности (глава 39); учетные записи (глава 40); совместно используемые библиотеки (главы 41 и 42).