Интерфейс программирования Linux
Copyright © 2010 Michael Kerrisk
Опубликовано No Starch Press, Inc.
|
Данный документ предоставляется по лицензии Creative Commons Attribution 3.0 License, за исключением разделов со специальными оговорками. |
Первая публикация на английском языке: Октябрь 2010
Library of Congress Control Number: 2010001947
Все права защищены. Никакая часть данной работы не может быть воспроизведена или передана ни коим образом, электронно или механически, включая фотокопирование, запись либо любым информационным сохранением или извлечением без предварительного письменного согласия владельца авторских прав и издателя.
Оригинал опубликован Microsoft Press
ISBN-13 978-1-59327-220-3
ISBN-10 1-59327-220-0
2017-07-31
- Автор
- Майкл Керриск
- Издатель
- Вильям Поллок
- Редактор выпуска
- Райли Хоффман
- Дизайн обложки
- Octopod Studios
- Эскиз передней страницы
- Роб Сьюистед
- Эскиз последней страницы
- Линли Кук
- Редактор текста
- Мэрилин Смит
- Наборщик
- Сьюзан Глайнерт Стивенс
- Корректор
- Линда Сейферт
- Введение
- Предмет книги
- Для кого эта книга
- Linux и UNIX
- Применение и организация книги
- Примеры программ
- Упражнения
- Стандарты и перемещаемость
- Ядро Linux и версии библиотек C
- Применение определённого программного интерфейса из других языков программирования
- Об авторе
- Благодарности
- Разрешения
- Веб сайт и исходные коды программ
- Обратная связь
- Глава 1. История и стандарты
- Глава 2. Фундаментальные понятия
- 2.1 Центральная операционная система: Ядро
- 2.2 Оболочка
- 2.3 Пользователи и группы
- 2.4 Иерархия отдельного каталога, каталоги, ссылки и файлы
- 2.5 Модель файлового ввода/ вывода
- 2.6 Программы
- 2.7 Процессы
- 2.8 Соответствия памяти
- 2.9 Статические и совместно используемые библиотеки
- 2.10 Межпроцессное взаимодействие и синхронизация
- 2.11 Сигналы
- 2.12 Потоки
- 2.13 Группы процессов и управление заданием оболочки
- 2.14 Сеансы, терминалы управления и управляющие процессы
- 2.15 Псевдотерминалы
- 2.16 Дата и время
- 2.17 Архитектура клиент- сервер
- 2.18 Время исполнения
- 2.19 Файловая система /proc
- 2.20 Выводы
- Глава 3. Основы системного программирования
- Глава 4. Файловый ввод/ вывод: Универсальная модель ввода/ вывода
- Глава 5. Файловый ввод/ вывод: Дальнейшие подробности
- 5.1 Условия атомарности и состязательности
- 5.2 Операции управления файлом: fcntl()
- 5.3 Флаги состояния открытого файла
- 5.4 Взаимосвязь между дескрипторами файла и открытыми файлами
- 5.5 Дублирование файловых дескрипторов
- 5.6 Файловый ввод/ вывод по определённому адресу: pread() and pwrite()
- 5.7 Чередующийся ввод/ вывод readv() and writev()
- 5.8 Усечения файла: truncate() и ftruncate()
- 5.9 Неблокируемый ввод/ вывод
- 5.10 Ввод/ вывод больших файлов
- 5.11 Каталог /dev/fd
- 5.12 Создание временных файлов
- 5.13 Выводы
- 5.14 Упражнения
- Глава 6. Процессы
- 6.1 Процессы и программы
- 6.2 Идентификатор процесса и идентификатор родительского процесса
- 6.3 Схема памяти процесса
- 6.4 Управление виртуальной памятью
- 6.5 Стек и фреймы стека
- 6.6 параметры командной строки (argc, argv)
- 6.7 Перечень окружения
- 6.8 Исполнение нелокального GoTo: setjmp() и longjmp()
- 6.9 Выводы
- 6.10 Упражнения
- Глава 7. Выделение памяти
- Глава 8. Пользователи и группы
- Глава 9. Полномочия процесса
- 9.1 Идентификатор реального пользователя и группы
- 9.2 Эффективный идентификатор пользователя и группы
- 9.3 Программы Set-User-ID и Set-Group-ID
- 9.4 Сохранённые Set-User-ID и Set-Group-ID
- 9.5 Идентификатор пользователя и группы файловой системы
- 9.6 Добавочный идентификатор группы
- 9.7 Процесс выборки и изменения полномочий
- 9.7.1 Процесс выборки и изменения реального, эффективного и сохранённого Set ID
- 9.7.2 Выборка и изменение идентификатора файловой системы
- 9.7.3 Выборка и изменение идентификатора файловой системы
- 9.7.4 Выборка и изменение добавочного идентификатора группы
- 9.7.5 Пример: Отображение полномочий процесса
- 9.8 Выводы
- 9.9 Упражнения
- Глава 10. Время
- Глава 11. Ограничения и варианты системы
- Глава 12. Информация системы и процесса
- Глава 13. Буферизация файлового ввода/ вывода
- 13.1 Буферизация ядра файлового ввода/ вывода: буфер кэширования
- 13.2 Буферизация в библиотеке stdio
- 13.3 Управление буферизацией ядра файлового ввода/ вывода
- 13.4 Резюме буферизации ввода/ вывода
- 13.5 Рекомендации ядра по шаблонам ввода/ вывода
- 13.6 Проброс буфера кэширования: Прямой ввод/ вывод
- 13.7 Различные библиотечные функции системные вызовы для ввода/ вывода
- 13.8 Выводы
- 13.9 Упражнения
- Глава 14. Файловые системы
- 14.1 Специализированные файлы устройств (Устройства)
- 14.2 Диски и разделы
- 14.3 Файловые системы
- 14.4 I-node
- 14.5 Виртуальная файловая система (VFS)
- 14.6 Файловые системы с журналированием
- 14.7 Иерархия отдельного каталога и точки монтирования
- 14.8 Монтирование и размонтирование файловых систем
- 14.9 Дополнительные свойства монтирования
- 14.10 Виртуальная файловая система: tmpfs
- 14.11 Получение информации о файловой системе: statvfs()
- 14.12 Выводы
- 14.13 Упражнения
- Глава 15. Атрибуты файла
- 15.1 Выборка информации о файле: stat()
- 15.2 Временные штампы файла
- 15.3 Владение файлом
- 15.4 Права доступа к файлу
- 15.4.1 Права доступа обычным файлом
- 15.4.2 Права доступа к каталогу
- 15.4.3 Алгоритм проверки прав доступа
- 15.4.4 Проверка доступности файла: access()
- 15.4.5 Set-User-ID, Set-Group-ID и биты Sticky
- 15.4.6 Маска создания режима файла процесса: umask()
- 15.4.7 Изменение прав доступа к файлу: chmod() and fchmod()
- 15.5 Флаги I-node (Расширенные файловые атрибуты ext2)
- 15.6 Выводы
- 15.7 Упражнения
- Глава 16. Расширенные атрибуты
- Глава 17. Списки управления доступом
- Глава 18. Каталоги и ссылки
- 18.1 Каталоги и (жёсткие) ссылки
- 18.2 Символические (мягкие) ссылки
- 18.3 Создание и удаление (жёстких) ссылок: link() и unlink()
- 18.4 Изменение имени файла: rename()
- 18.5 Работа с символическими ссылками: symlink() and readlink()
- 18.6 Создание и удаление каталогов: mkdir() и rmdir()
- 18.7 Удаление файла или каталога: remove()
- 18.8 Считывание каталогов: opendir() и readdir()
- 18.9 Проход по файловому дереву: nftw()
- 18.10 Текущий рабочий католог процесса
- 18.11 Работа относительно файлового дескриптора каталога
- 18.12 Изменение корневого каталога процесса: chroot()
- 18.13 Разрешение имени пути: realpath()
- 18.14 Разбор строк пути: dirname() и basename()
- 18.15 Выводы
- 18.16 Упражнения
- Глава 19. Мониторинг файловых событий
- Глава 20. Сигналы: Основные понятия
- 20.1 Основные понятия и обзор
- 20.2 Типы сигналов и действия по умолчанию
- 20.3 Изменение расстановки сигналов: signal()
- 20.4 Введение в обработчики сигналов
- 20.5 Отправка сигналов: kill()
- 20.6 Проверка наличия процесса
- 20.7 Другие варианты отправки сигналов: raise() and killpg()
- 20.8 Отображение описаний сигналов
- 20.9 Наборы сигналов
- 20.10 Маскирование сигнала (блокирование доставки сигнала)
- 20.11 Отложенные сигналы
- 20.12 Сигналы без очереди
- 20.13 Изменение расстановки сигналов: sigaction()
- 20.14 Ожидание сигнала: pause()
- 20.15 Выводы
- 20.16 Упражнения
- Глава 21. Сигналы: Обработчики сигналов
- Глава 22. Сигналы: Расширенные свойства
- 22.1 Файлы дампа ядра
- 22.2 Особые случаи доставки, расстановки и обработки
- 22.3 Состояния бездействия процесса прерываемые и не подлежащие прерыванию
- 22.4 Аппаратно вырабатываемые сигналы
- 22.5 Выработка синхронных и асинхронных сигналов
- 22.6 Времена и порядок доставки сигналов
- 22.7 Реализация переносимости signal()
- 22.8 Сигналы времени исполнения
- 22.9 Ожидание сигнала с применением маскирования: sigsuspend()
- 22.10 Синхронное ожидание сигнала
- 22.11 Опрос сигналов через файловые дескрипторы
- 22.12 Межпроцессное взаиможействие посредством сигналов
- 22.13 Более ранние API сигналов (System V и BSD)
- 22.14 Выводы
- 22.15 Упражнения
- Глава 23. Таймеры и бездействие
- 23.1 Интервалы таймеров
- 23.2 Планирование и точность таймеров
- 23.3 Установка таймаутов на блокируемых операциях
- 23.4 Приостановка исполнения на фиксированный интервал (бездействие)
- 23.5 Часы POSIX
- 23.6 Интервалы тамеров POSIX
- 23.7 Таймеры, оповещающие через файловые дескрипторы: API timerfd
- 23.8 Выводы
- 23.9 Упражнения
- Глава 24. Создание процесса
- Глава 25. Прекращение процесса
- Глава 26. Мониторинг порождённого процесса
- Глава 27. Исполнение программы
- Глава 28. Дополнительные подробности создания процесса и исполнения программы
- Глава 29. Потоки: Введение
- Глава 30. Потоки: Синхронизация потоков
- 30.1 Защита доступа к совместным переменным: Взаимные исключения
- 30.1.1 Статично выделенные взаимные исключения
- 30.1.2 Блокировка и снятие блокировки взаимных исключений
- 30.1.3 Производительность взаимных исключений
- 30.1.4 Тупиковые ситуации взаимных исключений
- 30.1.5 Динамическая инициализация взаимных исключений
- 30.1.6 Атрибуты взаимных исключений
- 30.1.7 Типы взаимных исключений
- 30.2 Отправка сигналов изменения состояния: условные переменные
- 30.3 Выводы
- 30.4 Упражнения
- Глава 31. Потоки: Безопасность потока и сохранение для каждого потока
- Глава 32. Потоки: Прекращение потока
- Глава 33. Потоки: Дополнительные подробности
- Глава 34. Группы процессов, сеансы и управление заданием
- Глава 35. Приоритеты процесса и планирование
- Глава 36. Ресурсы процесса
- Глава 37. Демоны
- Глава 38. Написание безопасной привилегированной программы
- 38.1 Требуется ли программа Set-User-ID, либо Set-Group-ID?
- 38.2 Работа с наименьшими привилегиями
- 38.3 Будьте аккуратны при исполнении программы
- 38.4 Избегайте выставления чувствительной информации
- 38.5 Ограничивайте процесс
- 38.6 Позаботьтесь о сигналах и условиях соперничества
- 38.7 Выставляйте ловушки при выполнении файловых операций и ввода/ вывода файлов
- 38.8 Не доверяйте входным данным или своему окружению
- 38.9 Позаботьтесь о переполнении буфера
- 38.10 Побеспокойтесь об атаках отказа- в- обслуживании
- 38.11 Аккуратно проверяйте возвращаемые состояния и отказы
- 38.12 Выводы
- 38.13 Упражнения
- Глава 39. Возможности
- 39.1 Обоснование возможностей
- 39.2 Возможности Linux
- 39.3 Возможности процесса и файла
- 39.3.1 Возможности процесса
- 39.3.2 Возможности файла
- 39.3.3 Установки разрешённой и действенной возможности цели процесса
- 39.3.4 Установки разрешённой и действенной возможности цели файла
- 39.3.5 Установки наследуемой цели процесса и файла
- 39.3.6 Назначение и просмотр возможностей файла в определённой оболочке
- 39.4 Реализация современных возможностей
- 39.5 Преобразование возможностей процесса на протяжении exec()
- 39.6 Воздействие изменения идентификатора пользователя на возможности процесса
- 39.7 Изменение возможностей процесса программными средствами
- 39.8 Более старые ядра и системы без возможностей файлов
- 39.9 Выводы
- 39.10 Выводы
- 39.11 Выводы
- 39.12 Упражнения
- Глава 40. Регистрационные учётные записи
- Глава 41. Основы совместно используемых библиотек
- 41.1 Объектные библиотеки
- 41.2 Статические библиотеки
- 41.3 Обзор совместно используемых библиотек
- 41.4 Создание и применение совместно используемых библиотек - Первый проход
- 41.5 Полезные инструменты для работы с совместно используемыми библиотеками
- 41.6 Врсии совместно используемых библиотек и соглашения именования
- 41.7 Установка совместно используемых библиотек
- 41.8 Сопоставление совместимых и несовместимых библиотек
- 41.9 Обновление совместно используемых библиотек
- 41.10 Определение каталогов поиска библиотек в объектном файле
- 41.11 Поиск совместно используемых библиотек в реальном масштабе времени
- 41.12 Разрешение символических ссылок времени исполнения
- 41.13 Применение статических библиотек вместо совместно используемых библиотек
- 41.14 Выводы
- 41.15 Упражнения
- Глава 42. Дополнительные свойства совместно используемых библиотек
- 42.1 Динамически загружаемые библиотеки
- 42.1.1 Открытие совместно используемой библиотеки: dlopen()
- 42.1.2 Диагностика ошибок: dlerror()
- 42.1.3 Получение символического адреса: dlsym()
- 42.1.4 Закрытие совместно используемой библиотеки: dlclose()
- 42.1.5 Получение информации о загруженных символических адресах: dladdr()
- 42.1.6 Доступ к символическим адресам в Основной программе
- 42.2 Управление видимостью символических адресов
- 42.3 Сценарии версии компоновщика
- 42.4 Функции инициализации и завершения
- 42.5 Прелварительно загружаемые совместно используемые библиотеки
- 42.6 Мониторинг динамического компоновщика: LD_DEBUG
- 42.7 Выводы
- 42.8 Упражнения
- Глава 43. Обзор взаимодействия процессов
- Глава 44. Конвейеры и FIFO
- 44.1 Обзор
- 44.2 Создание и применение конвейеров
- 44.3 Конвейеры как средство синхронизации процессов
- 44.4 Применение конвейеров для подключения фильтров
- 44.5 Общение командами оболочки через конвейер: popen()
- 44.6 Конвейеры и буферизация stdio
- 44.7 FIFO
- 44.8 Приложения клиент- сервер с применением FIFO
- 44.9 Неблокируемый ввод/ вывод
- 44.10 Семантики read() и write() в конвейерах и FIFO
- 44.11 Выводы
- 44.12 Упражнения
- Глава 45. Введение в IPC System V
- 45.1 Обзор API
- 45.2 Ключевые моменты IPC
- 45.3 Связанные структуры данных и полномочия объектов
- 45.4 Идентификаторы IPC и приложения клиент- сервер
- 45.5 Применяемый IPC System V алгоритм вызовов get
- 45.6 Команды ipcs и ipcrm
- 45.7 Получение перечня всех объектов IPC
- 45.8 Пределы IPC
- 45.9 Выводы
- 45.10 Упражнения
- Глава 46. Очереди сообщений System V
- 46.1 Создание или открытие очереди сообщений
- 46.2 Обмен сообщениями
- 46.3 Управление работой очереди сообщений
- 46.4 Связанная с очередью сообщений структура данных
- 46.5 Пределы очереди сообщений
- 46.6 Отображение всех очередей сообщений в данной системе
- 46.7 Программирование клиент- сервер с помощью очередей сообщений
- 46.8 Приложение файлового сервера с использованием очередей сообщений
- 46.9 Недостатки очередей сообщений System V
- 46.10 Выводы
- 46.11 Упражнения
- Глава 47. Семафоры System V
- 47.1 Обзор
- 47.2 Создание или открытие набора семафора
- 47.3 Операции управления семафором
- 47.4 Связанная с семафором структура данных
- 47.5 Инициализация семафора
- 47.6 Работа семафора
- 47.7 Обработка операций множественной блокировки семафора
- 47.8 Отменяемые значения семафора
- 47.9 Реализация двоичного протокола семафора
- 47.10 Пределы семафора
- 47.11 Недостатки семафоров System V
- 47.12 Выводы
- 47.13 Упражнения
- Глава 48. Совместно используемая память System V
- 48.1 Обзор
- 48.2 Создание и открытие сегмента совместно используемой памяти
- 48.3 Применение разделяемой памяти
- 48.4 Пример: Обмен данными через совместно используемую память
- 48.5 Местоположение совместно используемой памяти в виртуальной памяти
- 48.6 Хранение указателей в совместно используемой памяти
- 48.7 Операции управления совместно используемой памятью
- 48.8 Связанная с совместно используемой памятью структура данных
- 48.9 Пределы совместно используемой памяти
- 48.10 Выводы
- 48.11 Упражнения
- Глава 49. Соответствия памяти
- 49.1 Обзор
- 49.2 Создание соответствия: mmap()
- 49.3 Удаление соответствия области: munmap()
- 49.4 Соответствие файлов
- 49.5 Синхронизация области соответствия: msync()
- 49.6 Дополнительные флаги mmap()
- 49.7 Анонимное соответствие
- 49.8 Повторное установление соответствия отображаемой области: mremap()
- 49.9 MAP_NORESERV и переполнение пространства подкачки
- 49.10 Флаг MAP_FIXED
- 49.11 Нелинейные соответствия: remap_file_pages()
- 49.12 Выводы
- 49.13 Упражнения
- Глава 50. Работа с виртуальной памятью
- Глава 51. Введение в IPC Posix
- Глава 52. Очереди сообщений Posix
- 52.1 Обзор
- 52.2 Открытие, закрытие и снятие связей с очереди сообщений
- 52.3 Взаимосвязь между дескрипторами и очередями сообщений
- 52.4 Атрибуты очереди сообщений
- 52.5 Обмен сообщениями
- 52.6 Уведомление о сообщении
- 52.7 Специфичные для Linux свойства
- 52.8 Пределы очереди сообщений
- 52.9 Сравнение очередей сообщений POSIX и System V
- 52.10 Выводы
- 52.11 Упражнения
- Глава 53. Семафоры Posix
- Глава 54. Совместно используемая память Posix
- Глава 55. Блокировка файла
- 55.1 Обзор
- 55.2 Блокировка файла с помощью flock()
- 55.3 Блокировка записи с помощью fcntl()
- 55.3.1 Тупиковое состояние
- 55.3.2 Пример: Взаимодейтсвие с блокированной программной
- 55.3.3 Пример: Библиотека функций блокировки
- 55.3.4 Пределы блокировки и производительность
- 55.3.5 Семантика наследования блокировки и освобождения
- 55.3.6 Истощение блокировки и приоритетность очереди запросов на блокировку
- 55.4 Обязательная блокировка
- 55.5 Файл /proc/locks
- 55.6 Исполнение только одного экземпляра программы
- 55.7 Более старые техники блокировки
- 55.8 Выводы
- 55.9 Упражнения
- Глава 56. Сокеты: Введение
- Глава 57. Сокеты: Домены UNIX
- Глава 58. Сокеты: Основы сетевой среды TCP/IP
- Глава 59. Сокеты: Домены Интернет
- 59.1 Сокеты домена Интернет
- 59.2 Порядок байт в сети
- 59.3 Представление данных
- 59.4 Адресация сокета интернет
- 59.5 Обзор функций хоста и службы преобразования
- 59.6 Функции inet_pton() и inet_ntop()
- 59.7 Пример клиент- сервер (Сокеты дейтаграмм)
- 59.8 DNS
- 59.9 Файл /etc/services
- 59.10 Не зависящий от протокола хост и служба преобразования
- 59.11 Пример клиент- сервер (Сокеты дейтаграмм)
- 59.12 Библиотека сокетов домена Интернет
- 59.13 Устаревшие API для хоста и служб преобразования
- 59.14 Сопоставление сокетов UNIX и Интернет
- 59.15 Дальнейшая информация
- 59.16 Выводы
- 59.17 Упражнения
- Глава 60. Сокеты: Архитектура сервера
- Глава 61. Сокеты: Дополнительные вопросы
- 61.1 Частичные чтение и запись в потоковых сокетах
- 61.2 Системный вызов shutdown()
- 61.3 Специфичные для сокета системные вызовы ввода/ вывода recv() и send()
- 61.4 Системный вызов sendfile()
- 61.5 Выборка адресов сокета
- 61.6 Более пристальное рассмотрение TCP
- 61.7 Мониторинг сокетов: netstat
- 61.8 Применение tcpdump для наблюдения за обменов TCP
- 61.9 Опции сокета
- 61.10 Опция сокета SO_REUSEADDR
- 61.11 Наследование флагов и опции по accept()
- 61.12 Сопоставление TCP и UDP
- 61.13 Расширенные свойства
- 61.14 Выводы
- 61.15 Упражнения
- Глава 62. Терминалы
- 62.1 Обзор
- 62.2 Выборка и изменение атрибутов терминала
- 62.3 Команда stty
- 62.4 Специальные терминальные символы
- 62.5 Флаги терминала
- 62.6 Режимы ввода/ вывода терминала
- 62.7 Скорость линии терминала (Bit Rat)
- 62.8 Управление линией терминала
- 62.9 Размер окна терминала
- 62.10 Идентификация терминала
- 62.11 Выводы
- 62.12 Упражнения
- Глава 63. Альтернативные модели ввода/ вывода
- Глава 64. Псевдотерминалы
- Приложение A. Отслеживание системных вызовов
- Приложение B. разбор параметров командной строки
- Приложение C. Приведение указателя NULL
- Приложение D. Настройка ядра
- Приложение E. Дальнейшие источники информации
- Приложение F. Решения выбранных упражнений
- Библиография
- Указатель
Вы можете найти дополнительную информацию об этой книге, включая исправления ошибок и исходные коды всех примеров программ на следующей странице: http://www.man7.org/tlpi.
Michael Timothy Kerrisk
Munich, Germany and Christchurch, New Zealand
August 2010