Linux. Системное программирование (2-е изд.) - Роберт Лав стоит у истоков создания операционной системы Linux и внес существенный вклад в создание ядра Linux и настольной среды GNOME. Данная книга представляет собой руководство по системному программированию для Linux, справочник по системным вызовам Linux, а также подробный рассказ о том, как писать более быстрый и умный код. Лав четко разграничивает стандартные функции POSIX и специальные службы, которые предлагаются лишь в Linux. Это обновленное и дополненное издание, в котором появилась новая глава о многопоточности, позволяет подробно рассмотреть Linux как с теоретической, так и с прикладной точки зрения. Книга охватывает широкий круг аспектов программирования.
Название: Linux. Системное программирование (2-е изд.) Автор: Роберт Лав Издательство: Питер Год: 2014 Страниц: 448 Формат: PDF Размер: 12,2 МБ ISBN: 978-5-496-00747-4 Качество: Отличное Серия или Выпуск: Бестселлеры O'Reilly Язык: Русский
Содержание:
Предисловие Вступление Целевая аудитория и необходимые предпосылки Краткое содержание Версии, рассмотренные в книге Условные обозначения Работа с примерами кода Благодарности От издательства Глава 1. Введение и основополагающие концепции Системное программирование Зачем изучать системное программирование Краеугольные камни системного программирования Системные вызовы Библиотека C Компилятор C API и ABI API ABI Стандарты История POSIX и SUS Стандарты языка C Linux и стандарты Стандарты и эта книга Концепции программирования в Linux Файлы и файловая система Процессы Пользователи и группы Права доступа Сигналы Межпроцессное взаимодействие Заголовки Обработка ошибок Добро пожаловать в системное программирование Глава 2. Файловый ввод-вывод Открытие файлов Системный вызов open() Владельцы новых файлов Права доступа новых файлов Функция creat() Возвращаемые значения и коды ошибок Считывание с помощью read() Возвращаемые значения Считывание всех байтов Неблокирующее считывание Другие значения ошибок Ограничения размера для read() Запись с помощью write() Случаи частичной записи Режим дозаписи Неблокирующая запись Другие коды ошибок Ограничения размера при использовании write() Поведение write() Синхронизированный ввод-вывод fsync() и fdatasync() sync() Флаг O_SYNC Флаги O_DSYNC и O_RSYNC Непосредственный ввод-вывод Закрытие файлов Значения ошибок Позиционирование с помощью Iseek() Поиск с выходом за пределы файла Ограничения Позиционное чтение и запись Усечение файлов Мультиплексный ввод-вывод select() Системный вызов poll() Сравнение poll() и select() Внутренняя организация ядра Виртуальная файловая система Страничный кэш Страничная отложенная запись Резюме Глава 3. Буферизованный ввод-вывод Ввод-вывод с пользовательским буфером Стандартный ввод-вывод Открытие файлов Открытие потока данных с помощью файлового дескриптора Закрытие потоков данных Считывание из потока данных Считывание одного символа в момент времени Считывание целой строки Считывание двоичных данных Запись в поток данных Запись отдельного символа Запись строки символов Запись двоичных данных Пример программы, в которой используется буферизованный ввод-вывод Позиционирование в потоке данных Сброс потока данных Ошибки и конец файла Получение ассоциированного файлового дескриптора Управление буферизацией Безопасность программных потоков Блокировка файлов вручную Неблокируемые потоковые операции Недостатки стандартного ввода-вывода Резюме Глава 4. Расширенный файловый ввод-вывод Фрагментированный ввод-вывод Системные вызовы readv() и writev() Возвращаемые значения Пример использования writev() Пример использования readv() Реализация Опрос событий Создание нового экземпляра epoll Управление epoll Ожидание событий с помощью epoll Сравнение событий, запускаемых по фронту и по уровню сигнала Отображение файлов в память mmap() Системный вызов munmap() Пример отображения Преимущества mmap() Недостатки mmap() Изменение размеров отображения Изменение защиты отображения Синхронизация файла с помощью отображения Извещения об отображении Извещения об обычном файловом вводе-выводе Системный вызов posix_fadvise() Системный вызов readahead() Рекомендации почти ничего не стоят Синхронизированные, синхронные и асинхронные операции Планировщики и производительность ввода-вывода Адресация диска Жизненный цикл планировщика ввода-вывода Помощь при считывании Выбор и настройка планировщика ввода-вывода Оптимизация производительности ввода-вывода Резюме Глава 5. Управление процессами Программы, процессы и потоки Идентификатор процесса Выделение идентификатора процесса Иерархия процессов pid_t Получение идентификаторов процесса и родительского процесса Запуск нового процесса Семейство вызовов exec Системные вызовы fork() Завершение процесса Другие способы завершения atexit() on_exit() SIGCHLD Ожидание завершенных дочерних процессов Ожидание определенного процесса Еще больше гибкости при ожидании На сцену выходит BSD: wait3() и wait4() Запуск и ожидание нового процесса Зомби Пользователи и группы Реальные, действительные и сохраненные идентификаторы пользователя и группы Изменение реального или сохраненного идентификатора пользователя или группы Изменение действительного идентификатора пользователя или группы Изменение идентификаторов пользователя и группы согласно стилю BSD Изменение идентификаторов пользователя и группы согласно стилю HP-UX Действия с предпочтительными идентификаторами пользователя или группы Поддержка сохраненных пользовательских идентификаторов Получение идентификаторов пользователя и группы Сессии и группы процессов Системные вызовы сессий Системные вызовы групп процессов Устаревшие функции для группы процессов Демоны Резюме Глава 6. Расширенное управление процессами Планирование процессов Кванты времени Процессы ввода-вывода против ограниченных процессором Приоритетное планирование Completely Fair Scheduler Высвобождение ресурсов процессора Приоритеты процессов nice() getpriority() и setpriority() Приоритеты ввода-вывода Привязка процессов к процессору Системы реального времени Мягкие и жесткие системы реального времени Задержка, колебание и временное ограничение Поддержка реального времени в Linux Политики планирования и приоритеты в Linux Установка параметров планирования sched_rr_get_interval() Предосторожности при работе с процессами реального времени Детерминизм Лимиты ресурсов Лимиты по умолчанию Установка и проверка лимитов Коды ошибок Глава 7. Поточность Бинарные модули, процессы и потоки Многопоточность Издержки многопоточности Альтернативы многопоточности Поточные модели Поточность на уровне пользователя Комбинированная поточность Сопрограммы и фиберы Шаблоны поточности Поток на соединение Поток, управляемый событием Конкурентность, параллелизм и гонки Синхронизация Мьютексы Взаимные блокировки Р-потоки Реализация поточности в Linux API для работы с Р-потоками Связывание Р-потоков Создание потоков Идентификаторы потоков Завершение потоков Самозавершение Завершение других потоков Присоединение и отсоединение потоков Присоединение потоков Отсоединение потоков Пример поточности Мьютексы Р-потоков Инициализация мьютексов Запирание мьютексов Отпирание мьютексов Пример использования мьютексов Дальнейшее изучение Глава 8. Управление файлами и каталогами Файлы и их метаданные Семейство stat Разрешения Владение Расширенные атрибуты Перечисление расширенных атрибутов файла Каталоги Текущий рабочий каталог Создание каталогов Удаление каталогов Чтение содержимого каталога Ссылки Жесткие ссылки Символические ссылки Удаление ссылки Копирование и перемещение файлов Копирование Перемещение Узлы устройств Специальные узлы устройств Генератор случайных чисел Внеполосное взаимодействие Отслеживание файловых событий Инициализация inotify Стражи События inotify Расширенные события отслеживания Удаление стража inotify Получение размера очереди событий Уничтожение экземпляра inotify Глава 9. Управление памятью Адресное пространство процесса Страницы и их подкачка Области памяти Выделение динамической памяти Выделение массивов Изменение размера выделенных областей Освобождение динамической памяти Выравнивание Управление сегментом данных Анонимные отображения в памяти Создание анонимных отображений в памяти Отображение /dev/zero Расширенное выделение памяти Отладка при операциях выделения памяти Выделение памяти на основе стека Дублирование строк в стеке Массивы переменной длины Выбор механизма выделения памяти Управление памятью Установка байтов Сравнение байтов Перемещение байтов Поиск байтов Перещелкивание байтов Блокировка памяти Блокировка части адресного пространства Блокировка всего адресного пространства Разблокировка памяти Лимиты блокировки Находится ли страница в физической памяти Уступающее выделение памяти Глава 10. Сигналы Концепции, связанные с сигналами Идентификаторы сигналов Сигналы, поддерживаемые в Linux Основы управления сигналами Ожидание любого сигнала Примеры Выполнение и наследование Сопоставление номеров сигналов и строк Отправка сигнала Права доступа Примеры Отправка сигнала самому себе Отправка сигнала целой группе процессов Реентерабельность Наборы сигналов Блокировка сигналов Получение сигналов, ожидающих обработки Ожидание набора сигналов Расширенное управление сигналами Структура siginfo_t Удивительный мир si_code Отправка сигнала с полезной нагрузкой Изъян в UNIX? Глава 11. Время Структуры данных, связанные с представлением времени Оригинальное представление А теперь - с микросекундной точностью! И еще лучше: наносекундная точность Разбиение времени Тип для процессного времени Часы POSIX Получение текущего времени суток Более удобный интерфейс Продвинутый интерфейс Получение процессного времени Установка текущего времени суток Установка времени с заданной точностью Продвинутый интерфейс для установки времени Эксперименты с временем Настройка системных часов Засыпание и ожидание Засыпание с микросекундной точностью Засыпание с наносекундной точностью Продвинутая работа со спящим режимом Переносимый способ засыпания Превышение пределов Альтернативы засыпанию Таймеры Простые варианты сигнализации Интервальные таймеры Функции для расширенной работы с таймерами Приложение A. Расширения GCC для языка C GNU C Встраиваемые функции Подавление встраивания Чистые функции Постоянные функции Невозвращаемые функции Функции, выделяющие память Принудительная проверка возвращаемого значения вызывающей стороной Как пометить функцию как устаревшую Как пометить функцию как используемую Как пометить функции или параметры как неиспользуемые Упаковка структуры Увеличение границы выравнивания переменной Помещение глобальных переменных в регистр Аннотирование ветвей Получение типа выражения Получение границы выравнивания типа Смещение члена внутри структуры Получение возвращаемого адреса функции Диапазоны оператора case Арифметика указателей типа void и указателей на функции Более переносимо и красиво Приложение Б. Библиография Книги по языку программирования C Книги по программированию в Linux Книги, посвященные ядру Linux Книги об организации операционных систем