---
tags: [linux]
verified: 2026-08-22
---

# TLPI — База знаний

Заметки по книге "The Linux Programming Interface" (Michael Kerrisk).
Система: CachyOS (Arch-based). Редактор: VS Code + clangd.

---

## Среда разработки

### Установленные пакеты

```bash
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` — capabilities
- `libseccomp` — seccomp-фильтры
- `acl` — расширенные ACL

### VS Code

Расширение: **clangd** (от LLVM), не Microsoft C/C++.
clangd использует фронтенд Clang для анализа — точнее работает с системными заголовками и макросами POSIX API.

Файл `compile_flags.txt` в корне рабочей директории:
```text
-Wall
-Wextra
-pedantic
-std=c11
```

Для проектов с Makefile — утилита `bear` генерирует `compile_commands.json`:
```bash
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). Когда паттерн станет автоматическим — переключиться на обёртки Керриска, чтобы не тратить время на шаблонный код.

---

## Шаблон заметок по главе

При прохождении новой главы — копируй блок ниже и заполняй.

```markdown
### Глава N — Название

**Ключевые системные вызовы:** ...
**Основная идея:** ...
**Нюансы и подводные камни:**
- ...
**Связь с другими главами:** ...
**Полезные команды для экспериментов:**
- ...
**Открытые вопросы:** ...
```

---

## Связанные заметки

- [Linux — ядро: сборка, модули, параметры](./linux-kernel.md) — что происходит по другую сторону системного вызова
- [Linux — справочник команд: приложения и системные вызовы](./linux-tldr-syscall.md) — инструменты наблюдения за syscall
- [Методика изучения Go-библиотек](./go-library-study-guide.md) — похожий подход к систематическому изучению API
- [Магия как метафора: язык и культура Unix](./unix-magic-culture.md) — культурный слой за терминами процессов: zombie, orphan, reaper, kill, nice
- [Устройство ОС — план цикла статей](./os-knowledge-base-plan.md) — та же граница ядра и пользователя со стороны того, кто реализует ядро
- [Адресное пространство: зачем трансляция и какие есть альтернативы](./os-address-space-models.md) — что стоит за `mmap`, `fork` и разделяемой памятью со стороны железа и ядра
- [Стеки: ядра, прерываний, пользовательские](./os-stacks.md) — что происходит со стеком по ту сторону границы: стек ядра, альтернативный стек сигналов, лимиты
- [Ядро как программа: freestanding, компоновка, ABI, выбор языка](./os-kernel-as-program.md) — ABI системного вызова со стороны ядра, а не приложения
- [Вход в ядро и переключение контекста](./os-kernel-entry.md) — что происходит за системным вызовом: вход в ядро, проверка пользовательских указателей, доставка сигналов при возврате
