Программирование в Linux (+ CD)

Николай Иванов

Оглавление Введение 1
Предисловие 1
Условные обозначения 1
Диск с примерами 2
Благодарности 2
ЧАСТЬ I. ОСНОВЫ ПРОГРАММИРОВАНИЯ В LINUX 3
Глава 1. Создание программы 5
1.1. Исходный код 5
1.2. Компиляция 7
1.3. Компоновка 9
1.4. Многофайловые проекты 10
Глава 2. Автосборка 14
2.1. Обзор средств автосборки в Linux 14
2.2. Утилита make 16
2.3. Базовый синтаксис Makefile 17
2.4. Константы make 20
2.5. Рекурсивный вызов make 24
2.6. Получение дополнительной информации 29
Глава 3. Окружение 30
3.1. Понятие окружения 30
3.2. Чтение окружения: environ, getenv() 33
3.3. Модификация окружения: setenv(), putenv(), unsetenv() 35
3.4. Очистка окружения 39
Глава 4. Библиотеки 40
4.1. Библиотеки и заголовочные файлы 40
4.2. Подключение библиотек 41
4.3. Создание статических библиотек 42
4.4. Создание совместно используемых библиотек 46
4.5. Взаимодействие библиотек 49
Глава 5. Аргументы и опции программы 54
5.1. Аргументы программы 54
5.2. Использование опций 56
5.3. Использование длинных опций 59
5.4. Получение дополнительной информации 62
ЧАСТЬ II. НИЗКОУРОВНЕВЫЙ ВВОД-ВЫВОД В LINUX 63
Глава 6. Концепция ввода-вывода в Linux 65
6.1. Библиотечные механизмы ввода-вывода языка C 65
6.2. Концепция низкоуровневого ввода-вывода 69
6.3. Консольный ввод-вывод 70
6.4. Ввод-вывод в C++ 72
Глава 7. Базовые операции ввода-вывода 75
7.1. Создание файла: creat() 75
7.2. Открытие файла: open() 80
7.3. Закрытие файла: close() 84
7.4. Чтение файла: read() 86
7.5. Запись файла: write() 91
7.6. Произвольный доступ: lseek() 94
Глава 8. Расширенные возможности ввода-вывода в Linux 105
8.1. Взаимодействие с библиотечными механизмами 105
8.2. Векторное чтение: readv() 109
8.3. Векторная запись: writev() 113
8.4. Концепция "черных дыр" 117
ЧАСТЬ III. МНОГОЗАДАЧНОСТЬ 121
Глава 9. Основы многозадачности в Linux 123
9.1. Библиотечный подход: system() 123
9.2. Процессы в Linux 125
9.3. Дерево процессов 128
9.4. Получение информации о процессе 130
Глава 10. Базовая многозадачность 134
10.1. Концепция развилки: fork() 134
10.2. Передача управления: execve() 138
10.3. Семейство exec() 144
10.4. Ожидание процесса: wait() 152
Глава 11. Потоки 158
11.1. Концепция потоков в Linux 158
11.2. Создание потока: pthread_create() 160
11.3. Завершение потока: pthread_exit() 166
11.4. Ожидание потока: pthread_join() 167
11.5. Получение информации о потоке: pthread_self(), pthread_equal() 172
11.6. Отмена потока: pthread_cancel() 174
11.7. Получение дополнительной информации 177
Глава 12. Расширенная многозадачность 179
12.1. Уступчивость процесса: nice() 179
12.2. Семейство wait() 183
12.3. Зомби 187
ЧАСТЬ IV. ФАЙЛОВАЯ СИСТЕМА 189
Глава 13. Обзор файловой системы в Linux 191
13.1. Аксиоматика файловой системы в Linux 191
13.2. Типы файлов 192
13.3. Права доступа 194
13.4. Служебные файловые системы 197
13.5. Устройства 198
13.6. Монтирование файловых систем 200
Глава 14. Чтение информации о файловой системе 201
14.1. Семейство statvfs() 201
14.2. Текущий каталог: getcwd() 206
14.3. Получение дополнительной информации 209
Глава 15. Чтение каталогов 211
15.1. Смена текущего каталога: chdir() 211
15.2. Открытие и закрытие каталога: opendir(), closedir() 215
15.3. Чтение каталога: readdir() 216
15.4. Повторное чтение каталога: rewinddir() 217
15.5. Получение данных о файлах: семейство stat() 218
15.6. Чтение ссылок: readlink() 227
Глава 16. Операции над файлами 231
16.1. Удаление файла: unlink() 231
16.2. Перемещение файла: rename() 240
16.3. Создание ссылок: link() 242
16.4. Создание каталога: mkdir() 244
16.5. Удаление каталога: rmdir() 249
Глава 17. Права доступа 250
17.1. Смена владельца: chown() 250
17.2. Смена прав доступа: семейство chmod() 251
Глава 18. Временные файлы 261
18.1. Концепция использования временных файлов 261
18.2. Создание временного файла: mkstemp() 262
18.3. Закрытие и удаление временного файла 263
ЧАСТЬ V. МЕЖПРОЦЕССНОЕ ВЗАИМОДЕЙСТВИЕ 271
Глава 19. Обзор методов межпроцессного взаимодействия в Linux 273
19.1. Общие сведения о межпроцессном взаимодействии в Linux 273
19.2. Локальные методы межпроцессного взаимодействия 274
19.3. Удаленное межпроцессное взаимодействие 279
Глава 20. Сигналы 282
20.1. Понятие сигнала в Linux 282
20.2. Отправка сигнала: kill() 284
20.3. Обработка сигнала: sigaction() 286
20.4. Сигналы и многозадачность 288
20.5. Получение дополнительной информации 293
Глава 21. Использование общей памяти 294
21.1. Выделение памяти: shmget() 294
21.2. Активизация совместного доступа: shmat() 295
21.3. Отключение совместного доступа: shmdt() 296
21.4. Контроль использования памяти: shmctl() 296
21.5. Использование семафоров 300
21.6. Контроль за семафорами: semctl() 302
Глава 22. Использование общих файлов 306
22.1. Размещение файла в памяти: mmap() 306
22.2. Освобождение памяти: munmap() 307
22.3. Синхронизация: msync() 309
Глава 23. Каналы 314
23.1. Создание канала: pipe() 314
23.2. Перенаправление ввода-вывода: dup2() 318
23.3. Получение дополнительной информации 322
Глава 24. Именованные каналы FIFO 323
24.1. Создание именованного канала 323
24.2. Чтение, запись и закрытие FIFO 325
Глава 25. Сокеты 328
25.1. Типы сокетов 328
25.2. Создание и удаление сокетов 329
25.3. Назначение адреса: bind() 330
25.4. Соединение сокетов: connect() 334
25.5. Прослушивание сокета: listen() 336
25.6. Принятие запроса на подключение: accept() 336
25.7. Прием и передача данных через сокеты 340
25.8. Получение дополнительной информации 343
ЧАСТЬ VI. РАБОТА НАД ОШИБКАМИ И ОТЛАДКА 345
Глава 26. Выявление и обработка ошибок 347
26.1. Типы ошибок 347
26.2. Сообщения об ошибках 351
26.3. Макрос assert() 351
Глава 27. Ошибки системных вызовов 356
27.1. Чтение ошибки: errno 356
27.2. Сообщение об ошибке: strerror(), perror() 359
Глава 28. Использование отладчика gdb 362
28.1. Добавление отладочной информации 362
28.2. Запуск отладчика 363
28.3. Трансляция программы под отладчиком 367
28.4. Точки останова 373
28.5. Получение дополнительной информации 378
ПРИЛОЖЕНИЯ 381
Приложение 1. Именованные константы 383
Приложение 2. Коды ошибок системных вызовов 385
Приложение 3. Сигналы Linux 388
Приложение 4. Описание компакт-диска 390
Предметный указатель 397
VIII Оглавление VII Оглавление