Linux. Руководство программиста - Данное руководство позволит вам освоить обширный перечень инструментов с открытым исходным кодом, доступных для GNU/Linux. Автор книги, Джон Фуско, подробно и доступно описывает наиболее полезные из них, используя наглядные краткие примеры, которые легко видоизменять и использовать на практике. Начав с самых основ – загрузки, построения и установки, – вы узнаете, как распределены инструменты с открытым кодом и как найти оптимальное решение для той или иной задачи, углубите свои знания о ядре Linux и способах взаимодействия ОС с программным обеспечением. Изложение теоретической информации в книге ориентировано на последующее практическое применение. Освоив ее, вы сможете пользоваться самыми продвинутыми инструментами, применяя их для разработки собственных приложений, а также для увеличения производительности ПО и его отладки.
Название: Linux. Руководство программиста Автор: Дж. Фуско Издательство: Питер Год: 2011 Страниц: 448 Формат: PDF Размер: 11,0 МБ ISBN: 978-5-49807-794-9 Качество: Отличное Язык: Русский
Содержание:
Предисловие Введение Для кого эта книга Цель книги Рекомендации по чтению Структура книги Благодарности Об авторе От издательства Глава 1. Загрузка и установка инструментария для работы с открытым исходным кодом 1.1. Введение 1.2. Что такое программное обеспечение с открытым исходным кодом? 1.3. Что означает программное обеспечение с открытым исходным кодом для обычного пользователя? 1.3.1. Поиск инструментария 1.3.2. Форматы распространения 1.4. Архивные файлы 1.4.1. Идентификация архивных файлов 1.4.2. Запрос архивного файла 1.4.3. Извлечение файлов из архива 1.5. Менеджеры пакетов 1.5.1. Что лучше: исходный код или двоичные файлы? 1.5.2. Работа с пакетами 1.6. Кратко о безопасности и пакетах 1.6.1. Важность проверки подлинности 1.6.2. Базовая проверка подлинности пакетов 1.6.3. Проверка подлинности пакетов с использованием цифровых подписей 1.6.4. Подпись пакетов RPM с использованием инструмента GPG 1.6.5. Что делать, если проверка подлинности пакета невозможна 1.7. Проверка содержимого пакетов 1.7.1. Как осуществлять проверку пакетов 1.7.2. Обзор пакетов RPM 1.7.3. Обзор пакетов Debian 1.8. Обновление пакетов 1.8.1. Инструмент Apt: Advanced Package Tool 1.8.2. Инструмент Yum: Yellowdog Updater Modified 1.8.3. Synaptic: передовой GUI-интерфейс для APT 1.8.4. up2date: инструмент обновления пакетов Red Hat 1.9. Заключение Глава 2. Создание приложений на основе исходного кода 2.1. Введение 2.2. Инструменты для сборки приложений 2.2.1. Предыстория 2.2.2. Инструмент make 2.2.3. Связь программ 2.2.4. Понятие библиотек 2.3. Процесс сборки 2.3.1. GNU-инструменты сборки 2.3.2. Этап конфигурирования: сценарий configure 2.3.3. Этап сборки: make 2.3.4. Этап установки: make install 2.4. Понятие ошибок и предупреждений 2.4.1. Ошибки, распространенные в файлах Makefile 2.4.2. Ошибки на этапе конфигурирования 2.4.3. Ошибки на этапе сборки 2.4.4. Понятие ошибок компилятора 2.4.5. Понятие предупреждений компилятора 2.4.6. Понятие ошибок редактора связей 2.5. Заключение Глава 3. Поиск справочной документации 3.1. Введение 3.2. Интерактивные руководства 3.2.1. Страницы руководства man 3.2.2. Устройство руководства man 3.2.3. Поиск страниц руководства man: команда apropos 3.2.4. Поиск нужной страницы руководства man: команда whatis 3.2.5. Важные разделы страниц руководства man 3.2.6. Рекомендуемые страницы руководства man 3.2.7. GNU-программа info 3.2.8. Просмотр страниц info 3.2.9. Поиск страниц info 3.2.10. Рекомендуемые страницы info 3.2.11. Справочный инструментарий Рабочего стола 3.3. Другие источники справочной информации 3.3.1. /usr/share/doc 3.3.2. Перекрестные ссылки и индексация 3.3.3. Запрос пакетов 3.4. Форматы документации 3.4.1. TeX/LaTeX/DVI 3.4.2. Texinfo 3.4.3. DocBook 3.4.4. HTML 3.4.5. PostScript 3.4.6. Portable Document Format (PDF) 3.4.7. troff 3.5. Источники справочной информации в Интернете 3.5.1. www.gnu.org 3.5.2. SourceForge.net 3.5.3. Проект документации The Linux Documentation Project 3.5.4. Usenet 3.5.5. Списки рассылки 3.5.6. Прочие форумы 3.6. Поиск информации о ядре Linux 3.6.1. Сборка ядра 3.6.2. Модули ядра 3.6.3. Прочая документация 3.7. Заключение 3.7.1. Инструментарий, использованный в этой главе 3.7.2. Веб-ссылки Глава 4. Редактирование и сопровождение исходных файлов 4.1. Введение 4.2. Текстовый редактор 4.2.1. Важные функциональные возможности текстового редактора 4.2.2. Основные текстовые редакторы: vi и Emacs 4.2.3. Vim: усовершенствованная версия vi 4.2.4. Текстовый редактор Emacs 4.2.5. Атака клонов 4.2.6. Потребление памяти 4.3. Контроль версий 4.3.1. Основы контроля версий 4.3.2. Терминология в сфере контроля версий 4.3.3. Инструменты сопровождения 4.3.4. Команды diff и patch 4.3.5. Просмотр и объединение изменений 4.4. Инструменты для улучшения внешнего вида исходного кода и его просмотра 4.4.1. Инструмент для улучшения внешнего вида программного кода indent 4.4.2. Художественный стиль astyle 4.4.3. Анализ программного кода при помощи cflow 4.4.4. Анализ программного кода при помощи ctags 4.4.5. Просмотр программного кода при помощи cscope 4.4.6. Просмотр и создание документации к программному коду при помощи Doxygen 4.4.7. Использование компилятора для анализа программного кода 4.5. Заключение 4.5.1. Инструментарий, использованный в этой главе 4.5.2. Рекомендуемая литература 4.5.3. Веб-ссылки Глава 5. Что должен знать каждый разработчик о ядре Linux 5.1. Введение 5.2. Сравнение режима пользователя и режима ядра 5.3. Планировщик процессов 5.3.1. Основы планирования 5.3.2. Блокировка, вытеснение и уступка 5.3.3. Приоритеты и справедливость планирования 5.3.4. Приоритеты и значение nice 5.3.5. Приоритеты реального времени 5.3.6. Создание процессов реального времени 5.3.7. Состояния процессов 5.3.8. Порядок измерения времени 5.4. Понятие устройств и их драйверов 5.4.1. Типы драйверов устройств 5.4.2. Несколько слов о модулях ядра 5.4.3. Узлы устройств 5.4.4. Устройства и операции ввода/вывода 5.5. Планировщик операций ввода/вывода 5.5.1. Элеватор Linus Elevator (также называемый noop) 5.5.2. Планировщик операций ввода/вывода «крайнего срока» (Deadline I/O Scheduler) 5.5.3. «Ожидающий» планировщик операций ввода/вывода (Anticipatory I/O Scheduler) 5.5.4. «Справедливый» планировщик очереди операций ввода/вывода (Complete Fair Queuing I/O Scheduler) 5.5.5. Выбор планировщика операций ввода/вывода 5.6. Управление памятью в пространстве пользователя 5.6.1. Понятие виртуальной памяти 5.6.2. Нехватка памяти 5.7. Заключение 5.7.1. Инструментарий, использованный в этой главе 5.7.2. API-интерфейсы, рассмотренные в этой главе 5.7.3. Веб-ссылки 5.7.4. Рекомендуемая литература Глава 6. Процессы 6.1. Введение 6.2. Что порождает процессы? 6.2.1. Системные вызовы fork и vfork 6.2.2. Копирование при записи 6.2.3. Системный вызов clone 6.3. Функции exec 6.3.1. Исполняемые сценарии 6.3.2. Исполняемые объектные файлы 6.3.3. Разнообразные двоичные файлы 6.4. Синхронизация процессов при помощи wait 6.5. Объем памяти, занимаемый процессами 6.5.1. Дескрипторы файлов 6.5.2. Стек 6.5.3. Резидентная и блокированная память 6.6. Определение лимитов использования ресурсов процессами 6.7. Процессы и файловая система procfs 6.8. Инструменты для управления процессами 6.8.1. Вывод информации о процессах при помощи команды ps 6.8.2. Вывод расширенных сведений о процессах с использованием форматирования 6.8.3. Поиск процессов по имени при помощи команд ps и pgrep 6.8.4. Просмотр сведений о потреблении памяти процессами при помощи команды pmap 6.8.5. Отправка сигналов процессам на основе их имен 6.9. Заключение 6.9.1. Системные вызовы и API-интерфейсы, использованные в этой главе 6.9.2. Инструментарий, использованный в этой главе 6.9.3. Веб-ссылки Глава 7. Взаимодействие между процессами 7.1. Введение 7.2. Межпроцессное взаимодействие IPC с использованием плоских файлов 7.2.1. Блокировка файлов 7.2.2. Недостатки подхода, основанного на использовании файлов для обеспечения межпроцессного взаимодействия IPC 7.3. Разделяемая память 7.3.1. Управление разделяемой памятью при помощи API-интерфейса POSIX 7.3.2. Управление разделяемой памятью при помощи API-интерфейса System V 7.4. Сигналы 7.4.1. Отправка сигналов процессу 7.4.2. Обработка сигналов 7.4.3. Маска сигналов и обработка сигналов 7.4.4. Сигналы реального времени 7.4.5. Расширенные сигналы с использованием функций sigqueue и sigaction 7.5. Конвейеры (каналы) 7.6. Сокеты 7.6.1. Создание сокетов 7.6.2. Пример создания локального сокета при помощи функции socketpair 7.6.3. Пример пары «клиент/сервер», использующей локальные сокеты 7.6.4. Пример пары «клиент/сервер», использующей сетевые сокеты 7.7. Очереди сообщений 7.7.1. Очередь сообщений System V 7.7.2. Очередь сообщений POSIX 7.7.3. Различия между очередями сообщений POSIX и очередями сообщений System V 7.8. Семафоры 7.8.1. Работа с семафорами с использованием API-интерфейса POSIX 7.8.2. Работа с семафорами с использованием API-интерфейса System V 7.9. Заключение 7.9.1. Системные вызовы и API-интерфейсы, использованные в этой главе 7.9.2. Рекомендуемая литература 7.9.3. Веб-ссылки Глава 8. Отладка межпроцессного взаимодействия IPC при помощи команд оболочки 8.1. Введение 8.2. Инструментарий для работы с открытыми файлами 8.2.1. lsof 8.2.2. fuser 8.2.3. ls 8.2.4. file 8.2.5. stat 8.3. Сброс данных из файла 8.3.1. Команда strings 8.3.2. Команда xxd 8.3.3. Команда hexdump 8.3.4. Команда od 8.4. Команды оболочки для работы с объектами System V IPC 8.4.1. Разделяемая память System V 8.4.2. Очереди сообщений System V 8.4.3. Семафоры System V 8.5. Инструменты для работы с объектами POSIX IPC 8.5.1. Разделяемая память POSIX 8.5.2. Очереди сообщений POSIX 8.5.3. Семафоры POSIX 8.6. Инструменты для работы с сигналами 8.7. Инструменты для работы с каналами (конвейерами) и сокетами 8.7.1. Каналы и FIFO 8.7.2. Сокеты 8.8. Использование индексных дескрипторов для идентификации файлов и объектов IPC 8.9. Заключение 8.9.1. Инструментарий, использованный в этой главе 8.9.2. Веб-ссылки Глава 9. Настройка производительности 9.1. Введение 9.2. Производительность системы 9.2.1. Аспекты производительности, связанные с оперативной памятью 9.2.2. Использование центрального процессора и конкуренция за ресурсы шины 9.2.3. Устройства и прерывания 9.2.4. Инструменты для выявления причин снижения производительности системы 9.3. Производительность приложений 9.3.1. Шаг первый: использование команды time 9.3.2. Вывод сведений об архитектуре процессора при помощи инструмента x86info 9.3.3. Использование Valgrind для проверки эффективности инструкций 9.3.4. Инструмент ltrace 9.3.5. Использование strace для мониторинга производительности приложений 9.3.6. Традиционные инструменты для настройки производительности: gcov и gprof 9.3.7. Инструмент OProfile 9.4. Производительность многопроцессорных систем 9.4.1. Типы аппаратного обеспечения с поддержкой симметричной многопроцессорной обработки SMP 9.4.2. Программирование на компьютере с поддержкой симметричной многопроцессорной обработки SMP 9.5. Заключение 9.5.1. Аспекты, связанные с производительностью 9.5.2. Термины, рассмотренные в этой главе 9.5.3. Инструментарий, использованный в этой главе 9.5.4. Веб-ссылки 9.5.5. Рекомендуемая литература Глава 10. Отладка 10.1. Введение 10.2. Основной инструмент отладки: printf 10.2.1. Проблемы, возникающие при использовании printf 10.2.2. Эффективное использование инструмента printf 10.2.3. Заключительные положения по отладке с использованием printf 10.3. Комфортное использование GNU-отладчика gdb 10.3.1. Запуск программ с использованием gdb 10.3.2. Остановка и повторный запуск выполнения программы 10.3.3. Проверка данных и манипулирование ими 10.3.4. Подключение к выполняющемуся процессу при помощи gdb 10.3.5. Отладка файлов образов памяти 10.3.6. Отладка многопоточных программ при помощи gdb 10.3.7. Отладка оптимизированного программного кода 10.4. Отладка совместно используемых объектов 10.4.1. Когда и зачем необходимы совместно используемые объекты 10.4.2. Создание совместно используемых объектов 10.4.3. Определение местоположения совместно используемых объектов 10.4.4. Переназначение местоположения совместно используемых объектов по умолчанию 10.4.5. Безопасность и совместно используемые объекты 10.4.6. Инструментарий для работы с совместно используемыми объектами 10.5. Поиск проблем с памятью 10.5.1. Двойное освобождение 10.5.2. Утечки памяти 10.5.3. Переполнение буфера 10.5.4. Инструментарий, доступный в библиотеке glibc 10.5.5. Использование Valgrind для устранения проблем с памятью 10.5.6. Выявление переполнения с помощью инструмента Electric Fence 10.6. Использование нестандартных методик 10.6.1. Создание собственного «черного ящика» 10.6.2. Получение трасс стека процессов во время их выполнения 10.6.3. Принудительное генерирование файлов образов памяти 10.6.4. Использование сигналов 10.6.5. Использование procfs при проведении отладки 10.7. Заключение 10.7.1. Инструментарий, использованный в этой главе 10.7.2. Веб-ссылки 10.7.3. Рекомендуемая литература