, Интерфейс программирования Linux

Интерфейс программирования Linux

Майкл Керриск

 Состав исполнителей

Автор
Майкл Керриск
Издатель
Вильям Поллок
Редактор выпуска
Райли Хоффман
Дизайн обложки
Octopod Studios
Эскиз передней страницы
Роб Сьюистед
Эскиз последней страницы
Линли Кук
Редактор текста
Мэрилин Смит
Наборщик
Сьюзан Глайнерт Стивенс
Корректор
Линда Сейферт

 Об авторе

Майкл Керриск

 www.nostarch.com

 Содержание

Введение
Предмет книги
Для кого эта книга
Linux и UNIX
Применение и организация книги
Примеры программ
Упражнения
Стандарты и перемещаемость
Ядро Linux и версии библиотек C
Применение определённого программного интерфейса из других языков программирования
Об авторе
Благодарности
Разрешения
Веб сайт и исходные коды программ
Обратная связь
Глава 1. История и стандарты
1.1 Краткая история UNIX и C
1.2 Краткая история Linux
1.2.1 Проект GNU
1.2.2 Ядро Linux
1.3 Стандартизация
1.3.1 Язык программирования C
1.3.2 Самые первые стандарты POSIX
1.3.3 Компания X/Open и Open Group
1.3.4 SUSv3 и POSIX.1-2001
1.3.5 SUSv4 и POSIX.1-2008
1.3.6 Линия времени стандартов UNIX
1.3.7 Реализация стандартов
1.3.8 Linux, стандарты и основная линия стандартов Linux
Выводы
Глава 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. Основы системного программирования
3.1 Системные вызовы
3.2 Функции библиотеки
3.3 Стандартная библиотека C: Библиотека GNU C (glibc)
3.4 Обработка ошибок системных вызовов и библиотечных функций
3.5 Замечания по примерам программ в этой книге
3.5.1 Параметры и аргументы командной строки
3.5.2 Общие функции и файлы заголовков
3.6 Вопросы переносимости
3.6.1 Макросы проверки свойств
3.6.2 Типы системных данных
3.6.3 Различные проблемы переносимости
3.7 Выводы
3.8 Упражнения
Глава 4. Файловый ввод/ вывод: Универсальная модель ввода/ вывода
4.1 Обзор
4.2 Универсальность ввода/ вывода
4.3 Открытие файла: open()
4.3.1 Параметр open() flags
4.3.2 Ошибки open()
4.3.3 Системный вызов creat() flags
4.4 Чтение из файла: read()
4.5 Запись в файл: write()
4.6 Закрытие файла: close()
4.7 Изменение смещения в файле: lseek()
4.8 Выходящие за пределы универсальных операции ввода/ вывода: ioctl()
4.9 Выводы
4.10 Упражнения
Глава 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. Выделение памяти
7.1 Выделение памяти и куча
7.1.1 Выравнивание прерывания программы: brk() и sbrk()
7.1.2 Выделение памяти и куча: malloc() и free()
7.1.3 Реализация malloc() и free()
7.1.4 Прочие методы выделения памяти и кучи
7.2 Выделение памяти в стеке: ()
7.3 Выводы
7.4 Упражнения
Глава 8. Пользователи и группы
8.1 Файл пароля: /etc/passwd
8.2 Теневой файл пароля: /etc/shadow
8.2 Файл группы: /etc/group
8.4 Выборка информации пользователя и группы
8.5 Шифрование пароля и аутентификация пользователя
8.6 Выводы
8.7 Упражнения
Глава 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. Время
10.1 Время календаря
10.2 Функции преобразования вермени
10.2.1 Преобразование time_t в пригодную к отображению форму
10.2.2 Преобразование между time_t и вышедшим из строя временем
10.2.3 Преобразование вышедшим из строя временем и отображаемой формой
10.3 Временные зоны
10.4 Локализация
10.5 Обновление системного времени
10.6 Программные часы (Jiffies)
10.7 Время процесса
10.8 Выводы
10.9 Упражнения
Глава 11. Ограничения и варианты системы
11.1 Ограничения системы
11.2 Выборка ограничений системы (и необязательно) в реальном времени
11.3 Выборка ограничений файлов (и необязательно) в реальном времени
11.4 Неопределённые ограничения
11.5 Опции системы
11.6 Выводы
11.7 Упражнения
Глава 12. Информация системы и процесса
12.1 Файловая система /proc
12.1 Получение информации о процессе: /proc/PID
12.2 Системная информации в /proc
12.3 Доступ к файлам /proc
12.2 Идентификация в системе: uname()
12.3 Выводы
12.4 Упражнения
Глава 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.8.1 Монтирование файловой системы: mount()
14.8.2 Размонтирование файловой системы: umount() и umount2()
14.9 Дополнительные свойства монтирования
14.9.1 Монтирование файловой системы во множестве точек монтирования
14.9.2 Стекирование множественного монтирования в одной и той же точке монтирования
14.9.3 Флаги монтирования являющиеся параметром каждого монтирования
14.9.4 Связывание монтирований
14.9.5 Рекурсивное связывание монтирований
14.10 Виртуальная файловая система: tmpfs
14.11 Получение информации о файловой системе: statvfs()
14.12 Выводы
14.13 Упражнения
Глава 15. Атрибуты файла
15.1 Выборка информации о файле: stat()
15.2 Временные штампы файла
15.2.1 Изменение временных штампов при помощи utime() и utimes()
15.2.2 Изменение временных штампов при помощи utimensat() и futimens()
15.3 Владение файлом
15.3.1 Владение новым файлом
15.3.2 Изменение владельца файла: chown(), fchown() и lchown()
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. Расширенные атрибуты
16.1 Обзор
16.2 Подробности реализации расширенного атрибута
16.3 Системные вызовы для манипуляций расширенными атрибутами
16.4 Выводы
16.5 Упражнения
Глава 17. Списки управления доступом
17.1 Обзор
17.2 Алгоритм проверки прав доступа ACL
17.3 Длинная и короткая текстовые формы ACL
17.4 Запись ACL_MASK и класс группы ACL
17.5 Команды getfacl и setfacl
17.6 Создание ACL и файла по умолчанию
17.7 Пределы реализации ACL
17.8 API ACL
17.9 Выводы
17.10 Упражнения
Глава 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. Мониторинг файловых событий
19.1 Обзор
19.2 API inotify
19.3 События inotify
19.4 Чтение событий inotify
19.5 Ограничения очереди и файлы /proc
19.6 Более старые системы мониторинга файловых событий: dnotify
19.7 Выводы
19.8 Упражнения
Глава 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. Сигналы: Обработчики сигналов
21.1 Проектирование обработчика сигнала
21.1.1 Сигналы без очереди (Повторно)
21.1.2 Функции повторного входа и Async-Signal-Safe
21.1.3 Глобальные переменные и тип данных sig_atomic_t
21.2 Прочие методы прекращения обработчика сигнала
21.2.1 Исполнение нелокального GoTo из обработчика сигнала
21.2.2 Нештатное завершение процесса: abort()
21.3 Обработка сигнала в альтернативном стеке: sigaltstack()
21.4 Флаг SA_SIGINFO
21.5 Прерывание и построный запуск системного вызова
21.6 Выводы
21.7 Упражнения
Глава 22. Сигналы: Расширенные свойства
22.1 Файлы дампа ядра
22.2 Особые случаи доставки, расстановки и обработки
22.3 Состояния бездействия процесса прерываемые и не подлежащие прерыванию
22.4 Аппаратно вырабатываемые сигналы
22.5 Выработка синхронных и асинхронных сигналов
22.6 Времена и порядок доставки сигналов
22.7 Реализация переносимости signal()
22.8 Сигналы времени исполнения
22.8.1 Отправка сигналов времени исполнения
22.8.2 Обработка сигналов времени исполнения
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.4.1 Бездействие с низким разрешением
23.4.2 Бездействие с высоким разрешением
23.5 Часы POSIX
23.5.1 Выборка значения часов: clock_gettime()
23.5.2 Установка значения часов: clock_settime()
23.5.3 Получение идентификатора часов определённого процесса или потока
23.5.4 Улучшенное бездействие с высоким разрешением: clock_nanosleep()
23.6 Интервалы тамеров POSIX
23.6.1 Создание таймера: timer_create()
23.6.2 Завод и отмена таймера: timer_settime()
23.6.3 Выборка текущего значения таймера: timer_gettime()
23.6.4 Удаление таймера: timer_delete()
23.6.5 Оповещение сигналом
23.6.6 Перезапись таймера
23.6.7 Оповещение через поток
23.7 Таймеры, оповещающие через файловые дескрипторы: API timerfd
23.8 Выводы
23.9 Упражнения
Глава 24. Создание процесса
24.1 Обзор fork(), exit(), wait() и execve()
24.2 Создание нового процесса: fork()
24.2.1 Совместное использование файла предком и потомком
24.2.2 Семантики памяти fork()
24.3 Системный вызов vfork()
24.4 Условия соперничества после fork()
24.5 Обход условий соперничества путём синхронизации сигналами
24.6 Выводы
24.7 Упражнения
Глава 25. Прекращение процесса
25.1 Прекращение процесса: _exit() и exit()
25.2 Подробности прекращения процесса
25.3 Обработчики выхода
25.4 Взаимодействие между fork(), буферами stdio и _exit()
25.5 Выводы
25.6 Упражнения
Глава 26. Мониторинг порождённого процесса
26.1 Ожидание порождённого процесса
26.1.1 Системный вызов wait()
26.1.2 Системный вызов waitpid()
26.1.3 Значение состояния ожидания
26.1.4 Прекращение процесса обработчиком сигнала
26.1.5 Системный вызов waitid()
26.1.6 Системные вызовы wait3() и wait4()
26.2 Сироты и зомби
26.3 Сигнал SIGCHLD
26.3.1 Установка обработчика SIGCHLD
26.3.2 Доставка SIGCHLD остановленному потомку
26.3.3 Игнорирование умерших процессов потомков
26.4 Выводы
26.5 Упражнения
Глава 27. Исполнение программы
27.1 Исполнение новой программы: execve()
27.2 Библиотечные функции execve()
27.2.1 Переменная среды PATH
27.2.1 Определение параметров программы списком
27.2.1 Передача среды вызывающей стороны новой программе
27.2.1 Исполнение файла, полученного по ссылке дескриптора: fexecve()
27.3 Сценарии интерпретатора
27.4 Файловые дескрипторы и exec()
27.5 Сигналы и exec()
27.6 Исполнение команды оболочки: system()
27.7 Реализация system()
27.8 Выводы
27.9 Упражнения
Глава 28. Дополнительные подробности создания процесса и исполнения программы
28.1 Учётная запись процесса
28.2 Системный вызов clone()
28.2.1 Параметр flags clone()
28.2.2 Расширения waitpid() для клонированных потомков
28.3 Скорость создания процесса
28.4 Воздействие exec() и fork() на атрибуты процесса
28.5 Выводы
28.6 Упражнения
Глава 29. Потоки: Введение
29.1 Обзор
29.2 Подробности основ Pthreads API
29.3 Создание потока
29.4 Прекращение потока
29.5 Идентификаторы потока
29.6 Присоединение к прекращённому потоку
29.7 Отсоединение потока
29.8 Атрибуты потока
29.9 Сопоставление потоков и процессов
29.10 Выводы
29.11 Упражнения
Глава 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.2.1 Статично выделенные условные переменные
30.2.2 Отправка сигнала и ожидание условных переменных
30.2.3 Проверка предиката условной переменной
30.2.4 Пример программы: Присоединение к любому прекращённому потоку
30.2.5 Динамично выделенные условные переменные
30.3 Выводы
30.4 Упражнения
Глава 31. Потоки: Безопасность потока и сохранение для каждого потока
31.1 Безопасность потока (и пересмотр повторного входа)
31.2 Одномоментная инициализация
31.3 Данные, специфичные для потока
31.3.1 Специфичные для потока данные с точки зрения функций библиотеки
31.3.2 Обзор специфичных для потока данных API
31.3.3 Подробности специфичных для потока данных API
31.3.4 Применение специфичных для потока данных API
31.3.5 Ограничения реализации специфичных для потока данных
31.4 Локальное для потока хранилище
31.5 Выводы
31.6 Упражнения
Глава 32. Потоки: Прекращение потока
32.1 Прекращение потока
32.2 Состояние и тип прекращения
32.3 Точки прекращения
32.4 Проверка прекращения потока
32.5 Обработчики очистки
32.6 Выводы
32.7 Упражнения
Глава 33. Потоки: Дополнительные подробности
33.1 Стеки потока
33.2 Потоки и сигналы
33.2.1 Как модель сигналов UNIX соответствует потокам
33.2.2 Манипуляция маской сигнала потока
33.2.3 Отправка сигнала потоку
33.2.4 Разумные действия с асинхронными сигналами
33.3 Управление потоками и процессом
33.4 Модели реализации потока
33.5 Реализации Linux потоков POSIX
33.5.1 LinuxThreads
33.5.2 NPTL
33.5.3 Какова раелизация потоков?
33.6 Расширенные свойства Pthreads API
33.7 Выводы
33.8 Упражнения
Глава 34. Группы процессов, сеансы и управление заданием
34.1 Обзор
34.2 Группы процессов
34.3 Сеансы
34.4 Управляющие терминалы и процессы управления
34.5 Приоритетные и фоновые группы процессов
34.6 Сигнал SIGHUP
34.6.1 Управление SIGHUP оболочкой
34.6.2 SIGHUP и прекращение процесса управления
34.7 Управление заданием
34.7.1 Применение управления заданием внутри оболочки
34.7.2 Реализация управления заданием
34.7.3 Обработка сигналов управления заданием
34.7.4 Группы осиротевших процессов (и пересмотр SIGNHUP)
34.8 Выводы
34.9 Упражнения
Глава 35. Приоритеты процесса и планирование
35.1 Приоритеты процесса (Значения благожелательности)
35.2 Обзор планирования процессов времени исполнения
35.2.1 Политика SCHED_RR
35.2.2 Политика SCHED_FIFO
35.2.3 Политики SCHED_BATCH и SCHED_IDLE
35.3 API планирования процесса времени исполнения
35.3.1 Диапазоны приоритета времени исполнения
35.3.2 Изменение и выборка политик и приоритетов
35.3.3 Высвобождение ЦПУ
35.3.4 Срез времени SCHED_RR
35.4 Родство ЦПУ
35.5 Выводы
35.6 Упражнения
Глава 36. Ресурсы процесса
36.1 Загруженность ресурсов процесса
36.2 Ограничения ресурсов процесса
36.3 Подробности пределов особых ресурсов
36.4 Выводы
36.5 Упражнения
Глава 37. Демоны
37.1 Обзор
37.2 Создание демона
37.3 Руководства написания демона
37.4 Применение SIGHUP для повторной инициализации демона
37.5 Регистрация сообщений и ошибок с помощью syslog
37.5.1 Обзор
37.5.2 API syslog
37.5.3 Файл /etc/syslog.conf
37.6 Выводы
37.7 Упражнения
Глава 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.5.1 Набор возможностей связываения
39.5.1 Сохранение семантики root
39.6 Воздействие изменения идентификатора пользователя на возможности процесса
39.7 Изменение возможностей процесса программными средствами
39.8 Более старые ядра и системы без возможностей файлов
39.9 Выводы
39.10 Выводы
39.11 Выводы
39.12 Упражнения
Глава 40. Регистрационные учётные записи
40.1 Обзор файлов utmp и wtmp
40.2 API utmpx
40.3 Структура utmpx
40.4 Выборка информации из файлов файлов utmp и wtmp
40.5 Выборка имени регистрации: getlogin()
40.6 Обновление файлов utmp и wtmp для сеанса регистрации
40.7 Файл lastlog
40.8 Выводы
40.9 Упражнения
Глава 41. Основы совместно используемых библиотек
41.1 Объектные библиотеки
41.2 Статические библиотеки
41.3 Обзор совместно используемых библиотек
41.4 Создание и применение совместно используемых библиотек - Первый проход
41.4.1 Создание и применение совместно используемых библиотек - Первый проход
41.4.2 Независимый от положения код
41.4.3 Применение совместно используемых
41.4.4 Soname совместно используемых библиотек
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.3.1 Управление видимостью символических адресов при помощи сценариев весрии
42.3.2 Контроль версий символических адресов
42.4 Функции инициализации и завершения
42.5 Прелварительно загружаемые совместно используемые библиотеки
42.6 Мониторинг динамического компоновщика: LD_DEBUG
42.7 Выводы
42.8 Упражнения
Глава 43. Обзор взаимодействия процессов
43.1 Систематизация средств IPC
43.2 Средства взаимодействия
43.3 Средства синхронизации
43.4 Сравнение средств IPC
43.5 Выводы
43.6 Упражнения
Глава 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.2.1 Отправка сообщений
46.2.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.4.1 Частное соответствие файлов
49.4.2 Разделяемое соответствие файлов
49.4.3 Варианты ограничения
49.4.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. Работа с виртуальной памятью
50.1 Изменение защиты памяти: mprotect()
50.2 Блокировка памяти: mlock() и mlockall()
50.3 Определение резидентной памяти: mincore()
50.4 Рекомендуемые свойства шаблонов использования памяти: madvise()
50.5 Выводы
50.6 Упражнения
Глава 51. Введение в IPC Posix
51.1 Обзор API
51.2 Сравнение IPC System V и POSIX
51.3 Выводы
Глава 52. Очереди сообщений Posix
52.1 Обзор
52.2 Открытие, закрытие и снятие связей с очереди сообщений
52.3 Взаимосвязь между дескрипторами и очередями сообщений
52.4 Атрибуты очереди сообщений
52.5 Обмен сообщениями
52.5.1 Отправка сообщений
52.5.2 Приём сообщений
52.5.3 Отправка и приём сообщений сообщений с таймаутом
52.6 Уведомление о сообщении
52.6.1 Приём уведомления через сигнал
52.6.2 Приём уведомления с помощью потока
52.7 Специфичные для Linux свойства
52.8 Пределы очереди сообщений
52.9 Сравнение очередей сообщений POSIX и System V
52.10 Выводы
52.11 Упражнения
Глава 53. Семафоры Posix
53.1 Обзор
53.2 Именованные семафоры
53.2.1 Открытие именованного семафора
53.2.2 Закрытие семафора
53.2.3 Удаление именованного семафора
53.3 Работа семафоров
53.3.1 Ожидание на семафоре
53.3.2 Отправка семафора
53.3.3 Выборка текущего значения семафора
53.4 Неименованные семафоры
53.4.1 Инициализация неименованного семафора
53.4.2 Уничтожение неименованного семафора
53.5 Сравнение с прочими технологиями синхронизации
53.6 Пределы семафоров
53.7 Выводы
53.8 Упражнения
Глава 54. Совместно используемая память Posix
54.1 Обзор
54.2 Создание объектов совместно используемой памяти
54.3 Использование объектов совместно используемой памяти
54.4 Удаление объектов совместно используемой памяти
54.5 Сравнение API совместно используемой памяти
54.6 Выводы
54.7 Упражнения
Глава 55. Блокировка файла
55.1 Обзор
55.2 Блокировка файла с помощью flock()
55.2.1 Семантика наследования блокировки и освобождения
55.2.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. Сокеты: Введение
56.1 Обзор
56.2 Создание сокета: socket()
56.3 Привязка сокета к адресу: bind()
56.4 Общие структуры адреса сокета: struct sockaddr
56.5 Потоковые сокеты
56.5.1 Ожидание входящих соединений: listen()
56.5.2 Приём соединения: accept()
56.5.3 Соединение однорангового сокета: connect()
56.5.4 Ввод/ вывод в потоковых сокетах
56.5.5 Прекращение соединения: close()
56.6 Сокеты дейтаграмм
56.6.1 Обмен дейтаграммами: recvfrom() и sendto()
56.6.2 Применение connect() в сокетах дейтаграм
56.7 Выводы
Глава 57. Сокеты: Домены UNIX
57.1 Адреса сокета домена UNIX: struct sockaddr_un
57.2 Потоковые сокеты в домене UNIX
57.3 Сокеты дейтаграмм в домене UNIX
57.4 Полномочия сокета домена UNIX
57.5 Создание связанной пары сокетов: socketpair()
57.6 Абстракция Linux пространства имён сокета
57.7 Выводы
57.8 Упражнения
Глава 58. Сокеты: Основы сетевой среды TCP/IP
58.1 Интернет
58.2 Сетиевые протоколы и уровни
58.3 Канальный уровень
58.4 Сетевой уровень: IP
58.5 Адрес IP
58.6 Транспортный уровень
58.6.1 Номера портов
58.6.2 UDP
58.6.3 TCP
58.7 Запрос на комментарии (RFC)
58.8 Выводы
Глава 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.10.1 Функция getaddrinfo()
59.10.2 Освобождение списков addrinfo: freeaddrinfo()
59.10.3 Диагностические ошибки: gai_strerror()
59.10.4 Функция getnameinfo()
59.11 Пример клиент- сервер (Сокеты дейтаграмм)
59.12 Библиотека сокетов домена Интернет
59.13 Устаревшие API для хоста и служб преобразования
59.13.1 Функции net_aton() и inet_ntoa()
59.13.2 Функции gethostbyname() и gethostbyaddr()
59.13.3 Функции getservbyname() и getservbyport()
59.14 Сопоставление сокетов UNIX и Интернет
59.15 Дальнейшая информация
59.16 Выводы
59.17 Упражнения
Глава 60. Сокеты: Архитектура сервера
60.1 Итративные и параллельные серверы
60.2 Итеративный сервер echo UDP
60.3 Параллельный сервер echo TCP
60.4 Другие архитектуры параллельного сервера
60.5 Демон inetd (супервизора Интернета)
60.6 Выводы
60.7 Упражнения
Глава 61. Сокеты: Дополнительные вопросы
61.1 Частичные чтение и запись в потоковых сокетах
61.2 Системный вызов shutdown()
61.3 Специфичные для сокета системные вызовы ввода/ вывода recv() и send()
61.4 Системный вызов sendfile()
61.5 Выборка адресов сокета
61.6 Более пристальное рассмотрение TCP
61.6.1 Формат сегмента TCP
61.6.2 Последовательность нумерации TCP и подтверждения
61.6.3 Машина состояний TCP и диагарма перехода состояний
61.6.4 Установление соединения TCP
61.6.5 Прекращение соединения TCP
61.6.6 Вызов shutdown() в сокете TCP
61.6.7 Состояние TIME_WAIT
61.7 Мониторинг сокетов: netstat
61.8 Применение tcpdump для наблюдения за обменов TCP
61.9 Опции сокета
61.10 Опция сокета SO_REUSEADDR
61.11 Наследование флагов и опции по accept()
61.12 Сопоставление TCP и UDP
61.13 Расширенные свойства
61.13.1 Данные вне полосы
61.13.2 Системные вызовы sendmsg() and recvmsg()
61.13.3 Передача дескриптора файла
61.13.4 Приём полномочий отправителя
61.13.5 Сокеты последовательных пакетов
61.13.6 Протоколы транспортного уровня SCTP и DCCP
61.14 Выводы
61.15 Упражнения
Глава 62. Терминалы
62.1 Обзор
62.2 Выборка и изменение атрибутов терминала
62.3 Команда stty
62.4 Специальные терминальные символы
62.5 Флаги терминала
62.6 Режимы ввода/ вывода терминала
62.6.1 Канонический режим
62.6.2 Неканонический режим
62.6.3 Режимы Cooked, Cbreak и Raw
62.7 Скорость линии терминала (Bit Rat)
62.8 Управление линией терминала
62.9 Размер окна терминала
62.10 Идентификация терминала
62.11 Выводы
62.12 Упражнения
Глава 63. Альтернативные модели ввода/ вывода
63.1 Обзор
63.1.1 Уведомления переключаемые уровнем и фронтом
63.1.2 Применение неблокирующего ввода/ вывода в альтернативных моделях ввода/ вывода
63.2 Мультиплексирование ввода/ вывода
63.2.1 Системный вызов select()
63.2.2 Системный вызов poll()
63.2.3 Когда готов файловый дескриптор?
63.2.4 Сравнение select() и poll()
63.2.5 Проблемы с select() и poll()
63.3 Движимый сигналами ввод/ вывод
63.3.1 Когда выставляется сигнал "ввод/ вывод возможен"?
63.3.2 Совершенствование применения движимого сигналами ввода/ вывода
63.4 API epoll
63.4.1 Создание экземпляра epoll: epoll_create()
63.4.2 Изменение списка участия epoll: epoll_ctl()
63.4.3 Ожидание событий: epoll_wait()
63.4.4 Более подробное рассмотрение семантики epoll
63.4.5 Сопоставление производительности epoll и мультиплексирования
63.4.6 Переключаемые фронтом уведомления
63.5 Ожидание сигналов и файловых дескрипторов
63.5.1 Системный вызов pselect()
63.5.2 Хитрость конвейеризации самого себя
63.6 Выводы
63.7 Упражнения
Глава 64. Псевдотерминалы
64.1 Обзор
64.2 Псевдотерминалы UNIX 98
64.2.1 Открытие неиспользуемого хозяина: posix_openpt()
64.2.2 Изменение подчинённого владельца и полномочий: grantpt()
64.2.3 Разблокировка и подчинение: unlockpt()
64.2.4 Получение имени подчинённого: ptsname()
64.3 Открытие хозяина: ptyMasterOpen()
64.4 Соединение процесса с псевдотерминалом: ptyFork()
64.5 Ввод/ вывод псевдотерминала
64.6 Реализация script(1)
64.7 Атрибуты терминала и размер окна
64.8 Псевдотерминалы BSD
64.9 Выводы
64.10 Упражнения
Приложение A. Отслеживание системных вызовов
Приложение B. разбор параметров командной строки
Приложение C. Приведение указателя NULL
Приложение D. Настройка ядра
Приложение E. Дальнейшие источники информации
Приложение F. Решения выбранных упражнений
Библиография
Указатель

 Введение

 Предмет книги

 Для кого эта книга

 Linux и UNIX

 Применение и организация книги

 Примеры программ

 Упражнения

 Стандарты и перемещаемость

 Ядро Linux и версии библиотек C

 Применение определённого программного интерфейса из других языков программирования

 Об авторе

 Благодарности

 Разрешения

 Веб сайт и исходные коды программ

Вы можете найти дополнительную информацию об этой книге, включая исправления ошибок и исходные коды всех примеров программ на следующей странице: http://www.man7.org/tlpi.

 Обратная связь

Michael Timothy Kerrisk

Munich, Germany and Christchurch, New Zealand

August 2010

mtk@man7.org

l>