Рассмотрены фундаментальные основы программирования в Linux: инструментарий, низкоуровневый ввод-вывод, многозадачность, файловая система, межпроцессное взаимодействие и обработка ошибок. Книга главным образом ориентирована на практическое применение изложенных концепций. В ней есть все, что нужно начинающим, а углубленное изучение каждой темы делает ее ценной и для опытных программистов. Каждая тема проиллюстрирована большим числом примеров на языках С и С++ и Python, которые читатель сможет использовать в качестве образцов для собственных программ. На FTP-сервере издательства находятся исходные тексты программ. Во втором издании материал актуализирован с учетом современных тенденций, добавлены 3 новые главы по программированию в Linux на языке Python, устранены замеченные ошибки. Оглавление Введение Предисловие Условные обозначения Примеры программ Благодарности Обратная связь часть I Основы программирования в Linux Глава 1. Создание программы 1.1. Исходный код 1.2. Компиляция 1.3. Компоновка 1.4. Многофайловые проекты Глава 2 . Автосборка 2.1. Обзор средств автосборки в Linux 2.2. Утилита make 2.3. Базовый синтаксис Makefile 2.4. Константы make 2.5. Рекурсивный вызов make 2.6. Получение дополнительной информации Глава 3 . Окружение 3.1. Понятие окружения 3.2. Чтение окружения: environ, getenv() 3.3. Модификация окружения: setenv(), putenv(), unsetenv() 3.4. Очистка окружения Глава 4 . Библиотеки 4.1. Библиотеки и заголовочные файлы 4.2. Подключение библиотек 4.3. Создание статических библиотек 4.4. Создание совместно используемых библиотек 4.5. Взаимодействие библиотек Глава 5 . Аргументы и опции программы 5.1. Аргументы программы 5.2. Использование опций 5.3. Использование длинных опций 5.4. Получение дополнительной информации часть II Низкоуровневый ввод-вывод в Linux Глава 6 . Концепция ввода-вывода в Linux 6.1. Библиотечные механизмы ввода-вывода языка C 6.2. Концепция низкоуровневого ввода-вывода 6.3. Консольный ввод-вывод 6.4. Ввод-вывод в C++ Глава 7 . Базовые операции ввода-вывода 7.1. Создание файла: creat() 7.2. Открытие файла: open() 7.3. Закрытие файла: close() 7.4. Чтение файла: read() 7.5. Запись файла: write() 7.6. Произвольный доступ: lseek() Глава 8 . Расширенные возможности ввода-вывода в Linux 8.1. Взаимодействие с библиотечными механизмами 8.2. Векторное чтение: readv() 8.3. Векторная запись: writev() 8.4. Концепция "черных дыр" часть III Многозадачность Глава 9 . Основы многозадачности в Linux 9.1. Библиотечный подход: system() 9.2. Процессы в Linux 9.3. Дерево процессов 9.4. Получение информации о процессе Глава 10 . Базовая многозадачность 10.1. Концепция развилки: fork() 10.2. Передача управления: execve() 10.3. Семейство exec() 10.4. Ожидание процесса: wait() Глава 11 . Потоки 11.1. Концепция потоков в Linux 11.2. Создание потока: pthread_create() 11.3. Завершение потока: pthread_exit() 11.4. Ожидание потока: pthread_join() 11.5. Получение информации о потоке: pthread_self(), pthread_equal() 11.6. Отмена потока: pthread_cancel() 11.7. Получение дополнительной информации Глава 12 . Расширенная многозадачность 12.1. Уступчивость процесса: nice() 12.2. Семейство wait() 12.3. Зомби часть IV Файловая система Глава 13 . Обзор файловой системы в Linux 13.1. Аксиоматика файловой системы в Linux 13.2. Типы файлов 13.3. Права доступа 13.4. Служебные файловые системы 13.5. Устройства 13.6. Монтирование файловых систем Глава 14 . Чтение информации о файловой системе 14.1. Семейство statvfs() 14.2. Текущий каталог: getcwd() 14.3. Получение дополнительной информации Глава 15 . Чтение каталогов 15.1. Смена текущего каталога: chdir() 15.2. Открытие и закрытие каталога: opendir(), closedir() 15.3. Чтение каталога: readdir() 15.4. Повторное чтение каталога: rewinddir() 15.5. Получение данных о файлах: семейство stat() 15.6. Чтение ссылок: readlink() Глава 16 . Операции над файлами 16.1. Удаление файла: unlink() 16.2. Перемещение файла: rename() 16.3. Создание ссылок: link() 16.4. Создание каталога: mkdir() 16.5. Удаление каталога: rmdir() Глава 17 . Права доступа 17.1. Смена владельца: chown() 17.2. Смена прав доступа: семейство chmod() Глава 18 . Временные файлы 18.1. Концепция использования временных файлов 18.2. Создание временного файла: mkstemp() 18.3. Закрытие и удаление временного файла часть V Межпроцессное взаимодействие Глава 19 . Обзор методов межпроцессного взаимодействия в Linux 19.1. Общие сведения о межпроцессном взаимодействии в Linux 19.2. Локальные методы межпроцессного взаимодействия 19.3. Удаленное межпроцессное взаимодействие Глава 20 . Сигналы 20.1. Понятие сигнала в Linux 20.2. Отправка сигнала: kill() 20.3. Обработка сигнала: sigaction() 20.4. Сигналы и многозадачность 20.5. Получение дополнительной информации Глава 21 . Использование общей памяти 21.1. Выделение памяти: shmget() 21.2. Активизация совместного доступа: shmat() 21.3. Отключение совместного доступа: shmdt() 21.4. Контроль использования памяти: shmctl() 21.5. Использование семафоров 21.6. Контроль за семафорами: semctl() Глава 22 . Использование общих файлов 22.1. Размещение файла в памяти: mmap() 22.2. Освобождение памяти: munmap() 22.3. Синхронизация: msync() Глава 23 . Каналы 23.1. Создание канала: pipe() 23.2. Перенаправление ввода-вывода: dup2() 23.3. Получение дополнительной информации Глава 24 . Именованные каналы FIFO 24.1. Создание именованного канала 24.2. Чтение, запись и закрытие FIFO Глава 25 . Сокеты 25.1. Типы сокетов 25.2. Создание и удаление сокетов 25.3. Назначение адреса: bind() 25.4. Соединение сокетов: connect() 25.5. Прослушивание сокета: listen() 25.6. Принятие запроса на подключение: accept() 25.7. Прием и передача данных через сокеты 25.8. Получение дополнительной информации часть VI Работа над ошибками и отладка Глава 26 . Выявление и обработка ошибок 26.1. Типы ошибок 26.2. Сообщения об ошибках 26.3. Макрос assert() Глава 27 . Ошибки системных вызовов 27.1. Чтение ошибки: errno 27.2. Сообщение об ошибке: strerror(), perror() Глава 28 . Использование отладчика gdb 28.1. Добавление отладочной информации 28.2. Запуск отладчика 28.3. Трансляция программы под отладчиком 28.4. Точки останова 28.5. Получение дополнительной информации часть VII Программирование в Linux на языке Python Глава 29 . Язык Python 29.1. Несколько слов о языке Python 29.2. Инструментарий 29.3. Первая программа 29.4. Структура программы Глава 30 . Типы данных 30.1. Переменные 30.2. Целые числа 30.3. Числа с плавающей точкой 30.4. Строки 30.5. Списки Глава 31 . Программирование на языке Python 31.1. Логические операции 31.2. Сообщения об ошибках 31.3. Ветвления 31.4. Циклы 31.5. Функции приложения Приложение 1. Именованные константы Приложение 2 . Коды ошибок системных вызовов Приложение 3 . Сигналы Linux Приложение 4 . Примеры программ Предметный указатель