Заметки по книге "The Linux Programming Interface" (Michael Kerrisk). Система: CachyOS (Arch-based). Редактор: VS Code + clangd.
Среда разработки
Установленные пакеты
sudo pacman -S base-devel linux-headers man-pages gdb strace ltrace valgrind clang
Назначение:
base-devel— gcc, make, binutils и прочее для сборкиlinux-headers— заголовки ядраman-pages— справочные страницы (Керриск — мейнтейнер проекта, книга постоянно ссылается на man)gdb— отладчикstrace,ltrace— трассировка системных вызовов и библиотечных функцийvalgrind— обнаружение ошибок работы с памятьюclang— включает clangd (языковой сервер для C/C++)
Пакеты, которые понадобятся позже (по мере продвижения по книге):
libcap— capabilitieslibseccomp— seccomp-фильтрыacl— расширенные ACL
VS Code
Расширение: clangd (от LLVM), не Microsoft C/C++. clangd использует фронтенд Clang для анализа — точнее работает с системными заголовками и макросами POSIX API.
Файл compile_flags.txt в корне рабочей директории:
-Wall
-Wextra
-pedantic
-std=c11
Для проектов с Makefile — утилита bear генерирует compile_commands.json:
bear -- make
Исходники к книге
Скачать с https://man7.org/tlpi/code/ — архив содержит общие заголовки в lib/
(tlpi_hdr.h, error_functions.h и обёртки вроде errExit).
Без них примеры из книги не скомпилируются.
Оглавление и прогресс
Отмечай [x] по мере прохождения.
Часть I — Основы и концепции
- 1. History and Standards
- 2. Fundamental Concepts
- 3. System Programming Concepts
Часть II — Файловый ввод-вывод
- 4. File I/O: The Universal I/O Model
- 5. File I/O: Further Details
- 6. Processes
Часть III — Память и процессы
- 7. Memory Allocation
- 8. Users and Groups
- 9. Process Credentials
- 10. Time
- 11. System Limits and Options
- 12. Retrieving System and Process Information
Часть IV — Файловые системы
- 13. File I/O Buffering
- 14. File Systems
- 15. File Attributes
- 16. Extended Attributes
- 17. Access Control Lists
- 18. Directories and Links
- 19. Monitoring File Events
Часть V — Сигналы
- 20. Signals: Fundamental Concepts
- 21. Signals: Signal Handlers
- 22. Signals: Advanced Features
Часть VI — Таймеры и сон
- 23. Timers and Sleeping
Часть VII — Процессы: создание и завершение
- 24. Process Creation
- 25. Process Termination
- 26. Monitoring Child Processes
- 27. Program Execution
- 28. Process Creation and Program Execution in More Detail
Часть VIII — Потоки
- 29. Threads: Introduction
- 30. Threads: Thread Synchronization
- 31. Threads: Thread Safety and Per-Thread Storage
- 32. Threads: Thread Cancellation
- 33. Threads: Further Details
Часть IX — IPC: обзор и каналы
- 34. Process Groups, Sessions, and Job Control
- 35. Process Priorities and Scheduling
- 36. Process Resources
- 37. Daemons
- 38. Writing Secure Privileged Programs
- 39. Capabilities
- 40. Login Accounting
- 41. Fundamentals of Shared Libraries
- 42. Advanced Features of Shared Libraries
Часть X — IPC: System V и POSIX
- 43. Interprocess Communication Overview
- 44. Pipes and FIFOs
- 45. Introduction to System V IPC
- 46. System V Message Queues
- 47. System V Semaphores
- 48. System V Shared Memory
- 49. Memory Mappings
- 50. Virtual Memory Operations
- 51. Introduction to POSIX IPC
- 52. POSIX Message Queues
- 53. POSIX Semaphores
- 54. POSIX Shared Memory
- 55. File Locking
Часть XI — Сокеты
- 56. Sockets: Introduction
- 57. Sockets: UNIX Domain
- 58. Sockets: Fundamentals of TCP/IP
- 59. Sockets: Internet Domain
- 60. Sockets: Server Design
- 61. Sockets: Advanced Topics
Часть XII — Продвинутый ввод-вывод
- 62. Terminals
- 63. Alternative I/O Models
- 64. Pseudoterminals
Заметки из обсуждений
Настройка среды (старт)
clangd vs Microsoft C/C++ Extension: clangd построен на парсере Clang, поэтому его анализ практически идентичен реальной компиляции. Microsoft-расширение использует собственный IntelliSense, который хуже справляется с системными заголовками Linux и макросами POSIX. Для кода из TLPI разница заметна.
clangd в CachyOS: отдельного пакета clangd нет — он входит в clang (sudo pacman -S clang). Нужны два компонента: бинарник в системе + расширение clangd в VS Code.
Компилятор vs языковой сервер: clangd не заменяет gcc для сборки. Компилируешь по-прежнему через gcc/make, clangd только анализирует код в редакторе.
Сборка примеров и библиотека lib/
Примеры из книги зависят от вспомогательной библиотеки Керриска в lib/ — там живут функции обработки ошибок (errExit, errMsg, fatal) и общий заголовок tlpi_hdr.h. Это не обёртка над Linux API — системные вызовы вызываются напрямую. Библиотека только убирает шаблонный код проверки ошибок.
Компиляция отдельного примера с библиотекой: gcc -Wall -Wextra -std=c11 -I../lib prog.c ../lib/libtlpi.a -o prog. Либо make prog в директории примера — Makefile подставит нужные флаги и зависимости.
Некоторые главы требуют дополнительных флагов линковки: -lpthread (потоки, главы 29–33), -lrt (POSIX таймеры/очереди), -lcap (capabilities). Книга всегда это указывает.
Стратегия: на первых главах — не использовать lib/, писать обработку ошибок вручную через perror/strerror/exit. Это даёт понимание механики errno и того, как системные вызовы сигнализируют об ошибках (ключевая тема главы 3). Когда паттерн станет автоматическим — переключиться на обёртки Керриска, чтобы не тратить время на шаблонный код.
Шаблон заметок по главе
При прохождении новой главы — копируй блок ниже и заполняй.
### Глава N — Название
**Ключевые системные вызовы:** ...
**Основная идея:** ...
**Нюансы и подводные камни:**
- ...
**Связь с другими главами:** ...
**Полезные команды для экспериментов:**
- ...
**Открытые вопросы:** ...
Связанные заметки
- Linux — ядро: сборка, модули, параметры — что происходит по другую сторону системного вызова
- Linux — справочник команд: приложения и системные вызовы — инструменты наблюдения за syscall
- Методика изучения Go-библиотек — похожий подход к систематическому изучению API
- Магия как метафора: язык и культура Unix — культурный слой за терминами процессов: zombie, orphan, reaper, kill, nice
- Устройство ОС — план цикла статей — та же граница ядра и пользователя со стороны того, кто реализует ядро
- Адресное пространство: зачем трансляция и какие есть альтернативы — что стоит за
mmap,forkи разделяемой памятью со стороны железа и ядра - Стеки: ядра, прерываний, пользовательские — что происходит со стеком по ту сторону границы: стек ядра, альтернативный стек сигналов, лимиты
- Ядро как программа: freestanding, компоновка, ABI, выбор языка — ABI системного вызова со стороны ядра, а не приложения
- Вход в ядро и переключение контекста — что происходит за системным вызовом: вход в ядро, проверка пользовательских указателей, доставка сигналов при возврате
Из библиотеки института уносят только знания. Читателей здесь не считают: посещение не регистрируется, отметок в издании не остаётся, счётчиков нет ни у одного издания фонда.
Издание пополняется и пересверяется. Текст доступен на условиях CC BY-SA 4.0 — унесённое можно передавать дальше на тех же условиях.