Нейл Мэтью Ричард Стоунс Основы программирования в 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 Стандарт устройства файловой системы Что еще почитать о стандартах? Резюме
Немного теории Вот мы и добрались до теоретических основ UNIX и, конечно, Linux. ОС UNIX основана на интенсивном многократном применении кода и зависит от него. Вы разработали маленькую простую утилиту, и пользователи применяют ее как одну из ссылок в строке, формирующей команду. Одно из наслаждений, доставляемых ОС Linux, — разнообразие имеющихся отличных средств. Примером может служить следующая команда:
$ ls -al | more
Эта команда применяет утилиты ls
и more
и передает вывод списка файлов для поэкранного отображения. Каждая утилита — это отдельный блок. Зачастую вы можете применять множество мелких утилит для создания больших и сложных комплексов программ.
Например, если вы хотите напечатать контрольную копию справочного руководства оболочки bash, примените следующую команду:
$ man bash | col -b | lpr
Более того, благодаря автоматической обработке типов файлов пользователям этих утилит обычно не нужно знать, на каком языке данные программы написаны. Если необходимо ускорить выполнение утилиты, как правило, ее сначала моделируют в командной оболочке и затем, когда работоспособность утилиты проверена, реализуют ее на языке С или С++, Perl, Python или каком-либо другом, обеспечивающем более быстрое выполнение. В противном случае, если в командной оболочке утилита действует адекватно, вы вполне можете оставить ее в покое.
Необходимость переделки сценария зависит от того, нуждается ли он в оптимизации, должен ли он быть переносимым, необходимо ли обеспечить легкую модификацию и не перерос ли он (как это обычно случается) первоначально поставленную задачу.
Примечание Для удовлетворения вашего любопытства в вашу ОС Linux уже загружены многочисленные примеры сценариев, включая инсталляторы пакетов, .xinitrc
и startx
, и сценарии в каталоге /etc/rc.d, предназначенные для настройки системы в процессе загрузки.