Нейл Мэтью Ричард Стоунс Основы программирования в Linux 4-е издание Об авторах Благодарности Предисловие Введение Для кого эта книга? Чему посвящена книга? Что вам потребуется для использования книги? Исходный программный код Замечание, касающееся программного кода примеров Общедоступная лицензия проекта GNU Стилевое оформление, принятое в книге Ошибки Сайт p2p.wrox.com Глава 1 Приступая к работе Введение в UNIX, Linux и проект GNU Что такое ОС UNIX? Что такое Linux? Проект GNU и Фонд свободного ПО Дистрибутивы Linux Программирование в ОС Linux Linux-программы Текстовые редакторы Компилятор языка С Маршрутная карта системы разработки Получение справки Резюме Глава 2 Программирование средствами командной оболочки Почему программа в командной оболочке? Немного теории Что такое командная оболочка? Каналы и перенаправление Перенаправление вывода Перенаправление ввода Каналы Командная оболочка как язык программирования Интерактивные программы Создание сценария Превращение сценария в исполняемый файл Синтаксис командной оболочки Переменные Условия Управляющие структуры Функции Команды Выполнение команд Встроенные документы Отладка сценариев По направлению к графическому режиму — утилита dialog Соединяем все вместе Требования Проектирование Резюме Глава 3 Работа с файлами Структура файла в Linux Каталоги Файлы и устройства Системные вызовы и драйверы устройств Библиотечные функции Низкоуровневый доступ к файлам write read open Исходные права доступа Другие системные вызовы для управления файлами Стандартная библиотека ввода/вывода fopen fread fwrite fclose fflush fseek fgetc, getc и getchar fputc, putc и putchar fgets и gets Форматированные ввод и вывод printf, fprintf и sprintf scanf, fscanf и sscanf Другие потоковые функции Ошибки потока Потоки и дескрипторы файлов Ведение файлов и каталогов chmod chown unlink, link и symlink mkdir и rmdir chdir и getcwd Просмотр каталогов opendir readdir telldir seekdir closedir Ошибки strerror perror Файловая система procfs Более сложные приемы: fcntl и mmap fcntl mmap Резюме Глава 4 Окружение Linux Аргументы программы getopt getopt_long Переменные окружения Применение переменных окружения Переменная environ Время и дата Временные файлы Информация о пользователе Информация о компьютере Ведение системных журналов Ресурсы и ограничения Резюме Глава 5 Терминалы Чтение с терминала и запись на терминал Сравнение канонического и неканонического режимов Обработка перенаправленного вывода Диалог с терминалом Драйвер терминала A и общий терминальный интерфейс Обзор Аппаратная модель Структура типа termios Режимы ввода Режимы вывода Режимы управления Локальные режимы Специальные управляющие символы Скорость терминала Дополнительные функции Вывод терминала Тип терминала Установите тип вашего терминала Применение характеристик terminfo Обнаружение нажатий клавиш Виртуальные консоли Псевдотерминалы Резюме Глава 6 Управление текстовыми экранами с помощью библиотеки curses Компиляция с библиотекой curses Терминология библиотеки curses и общие представления Экран Вывод на экран Считывание с экрана Очистка экрана Перемещение курсора Атрибуты символов Клавиатура Режимы клавиатуры Клавиатурный ввод Окна Структура WINDOW Универсальные функции Перемещение и обновление окна Оптимизация обновлений экрана Вложенные окна Дополнительная клавиатура Применение цвета Переопределение цветов Панели Приложение, управляющее коллекцией компакт-дисков Начало нового приложения для работы с коллекцией компакт-дисков Взгляд на функцию main Формирование меню Управление базой данных Запросы к базе данных компакт-дисков Резюме Глава 7 Управление данными Управляемая память Простое выделение памяти Выделение огромных объемов памяти Неправильное обращение к памяти Указатель null Освобождение памяти Другие функции распределения памяти Блокировка файлов Создание файлов с блокировкой Блокировка участков файла Применение вызовов read и write при наличии блокировки Конкурирующие блокировки Другие команды блокировок Взаимоблокировки Базы данных База данных dbm Подпрограммы dbm Функции доступа dbm Дополнительные функции dbm Приложение для работы с коллекцией компакт-дисков Обновление проектного решения Приложение управления базой данных компакт-дисков, использующее dbm Резюме Глава 8 MySQL Установка Пакеты MySQL Настройка после установки Устранение неисправностей после установки Администрирование MySQL Команды Создание пользователей и наделение их правами доступа Пароли Создание базы данных Типы данных Создание таблицы Графические средства Доступ к данным MySQL из программ на С Подпрограммы подключения Обработка ошибок Выполнение SQL-операторов Разные функции Приложение для работы с базой данных компакт-дисков Создание таблиц Вставка данных Доступ к данным приложения из программы на С Резюме Глава 9 Средства разработки Проблемы применения многочисленных исходных файлов Команда make и make-файлы Синтаксис make-файлов Опции и параметры make Комментарии в make-файле Макросы в make-файле Множественные задания Встроенные правила Суффиксы и шаблоны правил Управление библиотеками с помощью make Более сложная тема: make-файлы и подкаталоги Версия GNU команд make и gcc Управление исходным кодом RCS SCCS Сравнение RCS и SCCS CVS Subversion Написание интерактивного справочного руководства Распространение программного обеспечения Программа patch Другие утилиты распространения RPM-пакеты Работа с файлами RPM-пакетов Установка RPM-пакетов Формирование RPM-пакетов Пакеты других форматов Среды разработки KDevelop Другие среды разработки Резюме Глава 10 Отладка Типы ошибок Общие методы отладки Программа с ошибками Анализ кода Оснащение средствами контроля Контролируемое выполнение Отладка с помощью gdb Запуск gdb Выполнение программы Трассировка стека Просмотр переменных Вывод листинга программы Установка точек останова Вставка исправлений с помощью отладчика Дополнительные сведения о gdb Дополнительные средства отладки Lint удаление ошибок из ваших программСредства, отслеживающие вызовы функций Выполнение профилирования с помощью prof/gprof Проверки соблюдения условий Устранение ошибок использования памяти ElectricFence valgrind Резюме Глава 11 Процессы и сигналы Что такое процесс? Структура процесса Таблица процессов Просмотр процессов Системные процессы Планирование процессов Запуск новых процессов Замена образа процесса Дублирование образа процесса Ожидание процесса Процессы-зомби Перенаправление ввода и вывода Потоки Сигналы Отправка сигналов Множества сигналов Резюме Глава 12 Потоки POSIX Что такое поток? Достоинства и недостатки потоков Первая программа с применением потоков Одновременное выполнение Синхронизация Синхронизация с помощью семафоров Синхронизация с помощью мьютексов Атрибуты потока Атрибуты планирования потока Отмена потока Потоки в изобилии Резюме Глава 13 Связь между процессами: каналы Что такое канал? Каналы процессов popen pclose Отправка вывода в popen Передача данных большого объема Как реализован вызов popen Вызов pipe Родительский и дочерний процессы Чтение закрытых каналов Каналы, применяемые как стандартные ввод и вывод Именованные каналы: FIFO Доступ к FIFO Более сложная тема: применение каналов FIFO в клиент-серверных приложениях Приложение для работы с базой данных компакт-дисков Цели Реализация Функции интерфейса клиента Интерфейс сервера server.c Канал Резюме, касающееся приложения Резюме Глава 14 Семафоры, совместно используемая память и очереди сообщений Семафоры Описание семафора Теоретический пример Реализация семафоров в Linux Применение семафоров Совместно используемая память shmget shmat shmdt shmctl Очереди сообщений msgget msgsnd msgrcv msgctl Приложение для работы с базой данных компакт-дисков Пересмотр функций сервера Пересмотр функций клиента Команды состояния IPC Отображение состояния семафора Отображение состояния совместно используемой памяти Отображение состояния очереди сообщений Резюме Глава 15 Сокеты Что такое сокет? Соединения на базе сокетов Атрибуты сокета Создание сокета Адреса сокетов Именование сокета Создание очереди сокетов Прием запросов на соединение Запросы соединений Закрытие сокета Обмен данными с помощью сокетов Порядок байтов на компьютере и в сети Сетевая информация Интернет-демон (xinetd/inetd) Параметры сокета Множественные клиенты select Множественные клиенты Дейтаграммы Резюме Глава 16 Программирование в GNOME с помощью GTK+ Введение в систему X X-сервер X-клиент X-протокол Xlib Комплекты инструментов Оконные менеджеры Другие способы создания GUI — платформно-независимые оконные API Введение в GTK+ Система типов GLib Система объектов GTK+ Знакомство с GNOME Установка библиотек разработки GNOME/GTK+ События, сигналы и обратные вызовы Виджеты упаковочных контейнеров Виджеты GTK+ GtkWindow GtkEntry GtkSpinButton GtkButton GtkTreeView Виджеты GNOME Меню GNOME Диалоговые окна GtkDialog Модальное диалоговое окно Немодальные диалоговые окна GtkMessageDialog Приложение для работы с базой данных компакт-дисков Резюме Глава 17 Программирование в KDE с помощью Qt Введение в KDE и Qt Установка Qt Сигналы и слоты Виджеты Qt QLineEdit Кнопки Qt QComboBox QListView Диалоговые окна QDialog QMessageBox QInputDialog Применение qmake для упрощения написания make-файлов Создание меню и панелей инструментов с помощью KDE Приложение для работы с базой данных компакт-дисков с использованием KDE/Qt MainWindow AddCdDialog LogonDialog main.cpp Резюме Глава 18 Стандарты Linux Язык программирования С Краткий урок истории Коллекция компиляторов GNU Опции gcc Интерфейсы и Linux Standards Base Стандартные библиотеки LSB Применение стандарта LSB к библиотекам Инициализация системы LSB Стандарт устройства файловой системы Что еще почитать о стандартах? Резюме
Что вам потребуется для использования книги? В этой книге мы привьем вам вкус к программированию в Linux. Для того чтобы извлечь максимум пользы, нужно в процессе чтения выполнять примеры. Они служат хорошей практической базой и наверняка вдохновят вас на создание собственных программ. Мы надеемся, что вы будете читать эту книгу и одновременно экспериментировать в установленной у вас системе Linux.
Существуют варианты Linux для самых разных систем. Адаптируемость Linux такова, что предприимчивые люди заставляют ее работать в том или ином виде на любом оборудовании, имеющем процессор! Примеры включают системы на базе процессоров Alpha, ARM, IBM Cell, Itanium, PA-RISC, PowerPC, SPARC, SuperH и ЦП 68k, а также на базе различных процессоров класса х86 с 32- и 64-разрядными версиями.
Мы писали эту книгу и разрабатывали примеры в двух системах Linux с разными спецификациями, поэтому мы уверены, что если у вас есть работающая система Linux, вы сможете найти хорошее применение этой книге. Более того, пока проходило техническое рецензирование книги, мы проверили программный код в других версиях Linux.
Работая над книгой, мы сначала главным образом использовали системы на базе процессоров x86, хотя мало что из описанного в книге характерно только для х86. Несмотря на то, что можно успешно запускать Linux на PC 486 с 8 Мбайт RAM, для успешной работы современного дистрибутива Linux и выполнения примеров из этой книги мы советуем выбрать современную версию одного из наиболее популярных дистрибутивов Linux, например Fedora, openSUSE или Ubuntu, и проверить их аппаратные рекомендации.
Что касается требований к программному обеспечению, мы полагаем, что вы используете современную версию предпочитаемого вами дистрибутива Linux и, чтобы поддерживать систему на современном уровне и иметь самые свежие исправления найденных ошибок, применяете текущий набор обновлений, которые большинство поставщиков делают доступными интерактивно в виде автоматических обновлений. Linux и комплект инструментальных средств проекта GNU выпускаются на условиях GNU General Public License (GPL) (Общедоступной лицензии проекта GNU). Большинство других компонентов типичного дистрибутива Linux ссылаются либо на GPL, либо на одну из множества других лицензий Open Source (открытый или свободно распространяемый программный код), и это означает, что у них есть определенные характеристики, одна из которых — свобода. У них всегда есть исходный программный код, и никто не может отнять эту свободу. Дополнительную информацию о GPL см. на Web-сайте http://www.gnu.org/licenses/, а определение Open Source и разные применяемые лицензии — на Web-сайте http://www.opensource.org. В случае GNU/Linux у вас всегда будет возможность технической поддержки либо благодаря самостоятельной работе с исходным программным кодом, либо за счет найма стороннего специалиста или обращения к одному из поставщиков, предлагающих платную техническую поддержку.