Книга: Linux программирование в примерах
Оглавление книги
- Предисловие
- Часть 1 Файлы и пользователи
- Глава 1 Введение
- 1.1. Модель файловой системы Linux/Unix
- 1.1.1. Файлы и права доступа
- 1.1.2. Каталоги и имена файлов
- 1.1.3. Исполняемые файлы
- 1.1.4. Устройства
- 1.2. Модель процессов Linux/Unix
- 1.3. Стандартный С против оригинального С
- 1.4. Почему программы GNU лучше
- 1.4.1. Проектирование программ
- 1.4.2. Поведение программы
- 1.4.3. Программирование на С
- 1.4.4. Вещи, которые делают программы GNU лучше
- 1.4.5. Заключительные соображения по поводу «GNU Coding Standards»
- 1.5. Пересмотренная переносимость
- 1.6. Рекомендуемая литература
- 1.7. Резюме
- Упражнения
- Глава 2 Аргументы, опции и переменные окружения
- 2.1. Соглашения по опциям и аргументам
- 2.2. Базовая обработка командной строки
- 2.3. Разбор опций: getopt() и getopt_long()
- 2.4. Переменные окружения
- 2.5. Резюме
- Упражнения
- Глава 3 Управление памятью на уровне пользователя
- 3.1. Адресное пространство Linux/Unix
- 3.2. Выделение памяти
- 3.2.1. Библиотечные вызовы: malloc(), calloc(), realloc(), free()
- 3.2.1.1. Исследование подробностей на языке С
- 3.2.1.2. Начальное выделение памяти: malloc()
- 3.2.1.3. Освобождение памяти: free()
- 3.2.1.4. Изменение размера: realloc()
- 3.2.1.5. Выделение с инициализацией нулями: calloc()
- 3.2.1.6. Подведение итогов из GNU Coding Standards
- 3.2.1.7. Использование персональных программ распределения
- 3.2.1.8. Пример: чтение строк произвольной длины
- 3.2.1.9. Только GLIBC: чтение целых строк: getline() и getdelim()
- 3.2.2. Копирование строк: strdup()
- 3.2.3. Системные вызовы: brk() и sbrk()
- 3.2.4. Вызовы ленивых программистов: alloca()
- 3.2.5. Исследование адресного пространства
- 3.3. Резюме
- Упражнения
- Глава 4 Файлы и файловый ввод/вывод
- 4.1. Введение в модель ввода/вывода Linux/Unix
- 4.2. Представление базовой структуры программы
- 4.3. Определение ошибок
- 4.4. Ввод и вывод
- 4.4.1. Понятие о дескрипторах файлов
- 4.4.2. Открытие и закрытие файлов
- 4.4.3. Чтение и запись
- 4.4.4. Пример: Unix cat
- 4.5. Произвольный доступ: перемещения внутри файла
- 4.6. Создание файлов
- 4.6.1. Определение начальных прав доступа к файлу
- 4.6.2. Создание файлов с помощью creat()
- 4.6.3. Возвращаясь к open()
- 4.7. Форсирование записи данных на диск
- 4.8. Установка длины файла
- 4.9. Резюме
- Упражнения
- Глава 5 Каталоги и служебные данные файлов
- 5.1. Просмотр содержимого каталога
- 5.1.1. Определения
- 5.1.2. Содержимое каталога
- 5.1.3. Прямые ссылки
- 5.1.4. Переименование файлов
- 5.1.5. Удаление файла
- 5.1.6. Символические ссылки
- 5.2. Создание и удаление каталогов
- 5.3. Чтение каталогов
- 5.4. Получение информации о файлах
- 5.4.1. Типы файлов Linux
- 5.4.2. Получение информации о файле
- 5.4.3. Только Linux: указание файлового времени повышенной точности
- 5.4.4. Определение типа файла
- 5.4.5. Работа с символическими ссылками
- 5.5. Смена владельца, прав доступа и времени изменения
- 5.5.1. Смена владельца файла: chown(), fchown() и lchown()
- 5.5.2. Изменение прав доступа: chmod() и fchmod()
- 5.5.3. Изменение временных отметок: utime()
- 5.5.4. Использование fchown() и fchmod() для обеспечения безопасности
- 5.6. Резюме
- Упражнения
- Глава 6 Общие библиотечные интерфейсы — часть 1
- 6.1. Времена и даты
- 6.1.1. Получение текущего времени: time() и difftime()
- 6.1.2. Разложение времени: gmtime() и localtime()
- 6.1.3. Форматирование даты и времени
- 6.1.3.1. Простое форматирование времени: asctime() и ctime()
- 6.1.3.2. Сложное форматирование времени: strftime()
- 6.1.4. Преобразование разложенного времени в time_t
- 6.1.5. Получение сведений о часовом поясе
- 6.2. Функции сортировки и поиска
- 6.3. Имена пользователей и групп
- 6.4. Терминалы: isatty()
- 6.5. Рекомендуемая литература
- 6.6. Резюме
- Упражнения
- Глава 7 Соединяя все вместе: ls
- Глава 8 Файловые системы и обходы каталогов
- 8.1. Монтирование и демонтирование файловых систем
- 8.1.1. Обзор основ
- 8.1.2. Обзор различных типов файловых систем
- 8.1.3. Монтирование файловых систем: mount
- 8.1.4. Демонтирование файловых систем: umount
- 8.2. Файлы для администрирования файловой системы
- 8.2.1. Использование опций монтирования
- 8.2.2. Работа со смонтированными файловыми системами: getmntent()
- 8.3. Получение сведений о файловой системе
- 8.4. Перемещение по иерархии файлов
- 8.4.1. Смена каталога: chdir() и fchdir()
- 8.4.2. Получение текущего каталога: getcwd()
- 8.4.3. Перемещение по иерархии: nftw()
- 8.5. Обход дерева файлов: GNU du
- 8.6. Изменение корневого каталога: chroot()
- 8.7. Резюме
- Упражнения
- Часть 2 Процессы, IPC и интернационализация
- Глава 9 Управление процессами и каналы
- 9.1. Создание и управление процессами
- 9.1.1. Создание процесса: fork()
- 9.1.1.1. После fork(): общие и различные атрибуты
- 9.1.1.2. Разделение дескрипторов файлов
- 9.1.1.3. Разделение дескрипторов файлов и close()
- 9.1.2. Идентификация процесса: getpid() и getppid()
- 9.1.3. Установка приоритетов процесса: nice()
- 9.1.4. Запуск новой программы: семейство exec()
- 9.1.4.1. Системный вызов execve()
- 9.1.4.2. Функции-оболочки: execl() и др.
- 9.1.4.3. Имена программ и argv
- 9.1.4.4. Атрибуты, наследуемые exec()
- 9.1.5. Завершение процесса
- 9.1.5.1. Определение статуса завершения процесса
- 9.1.5.2. Возвращение из main()
- 9.1.5.3. Функции завершения
- 9.1.6. Использование статуса завершения порожденного процесса
- 9.2. Группы процессов
- 9.2.1. Обзор управления заданиями
- 9.2.2. Идентификация группы процессов: getpgrp() и getpgid()
- 9.2.3. Установка группы процесса: setpgid() и setpgrp()
- 9.3. Базовое межпроцессное взаимодействие: каналы и очереди FIFO
- 9.4. Управление дескрипторами файлов
- 9.4.1. Дублирование открытых файлов: dup() и dup2()
- 9.4.2. Создание нелинейных конвейеров: /dev/fd/XX
- 9.4.3. Управление атрибутами файла: fcntl()
- 9.5. Пример: двусторонние каналы в gawk
- 9.6. Рекомендуемая литература
- 9.7. Резюме
- Упражнения
- Глава 10 Сигналы
- 10.1. Введение
- 10.2. Действия сигналов
- 10.3. Стандартные сигналы С: signal() и raise()
- 10.4. Обработчики сигналов в действии
- 10.4.1. Традиционные системы
- 10.4.2. BSD и GNU/Linux
- 10.4.3. Игнорирование сигналов
- 10.4.4. Системные вызовы, допускающие повторный запуск
- 10.4.4.1. Пример: GNU Coreutils safe_read() и safe_write()
- 10.4.4.2. Только GLIBC: TEMP_FAILURE_RETRY()
- 10.4.5. Состояния гонок и sig_atomic_t (ISO C)
- 10.4.6. Дополнительные предостережения
- 10.4.7. Наша история до настоящего времени, эпизод 1
- 10.5. API сигналов System V Release 3: sigset() и др.
- 10.6. Сигналы POSIX
- 10.6.1. Обнажение проблемы
- 10.6.2. Наборы сигналов: sigset_t и связанные функции
- 10.6.3. Управление маской сигналов: sigprocmask() и др.
- 10.6.4. Перехват сигналов: sigaction()
- 10.6.5. Извлечение ожидающих сигналов: sigpending()
- 10.6.6. Создание возможности для прерывания функций: siginterrupt()
- 10.6.7. Передача сигналов: kill() и killpg()
- 10.6.8. Наша история до настоящего времени, эпизод II
- 10.7. Сигналы для межпроцессного взаимодействия
- 10.8. Важные сигналы специального назначения
- 10.8.1. Сигнальные часы: sleep(), alarm() и SIGALARM
- 10.8.2. Сигналы, управляющие заданиями
- 10.8.3. Родительский надзор: три различные стратегии
- 10.9. Сигналы, передающиеся через fork() и exec()
- 10.10. Резюме
- Упражнения
- Глава 11 Права доступа и ID пользователей и групп
- 11.1. Проверка прав доступа
- 11.2. Получение ID пользователя и группы
- 11.3. Проверка для действительного пользователя: access()
- 11.4. Проверка для эффективного пользователя: euidaccess() (GLIBC)
- 11.5. Установка дополнительных битов доступа для каталогов
- 11.6. Установка действительных и эффективных ID
- 11.6.1. Изменение набора групп
- 11.6.2. Изменение действительного и эффективного ID
- 11.6.3. Использование битов setuid и setgid
- 11.7. Работа со всеми тремя ID: getresuid() и setresuid() (Linux)
- 11.8. Пересечение минного поля безопасности: setuid root
- 11.9. Рекомендуемая литература
- 11.10. Резюме
- Упражнения
- Глава 12 Общие библиотечные интерфейсы — часть 2
- 12.1. Операторы проверки: assert()
- 12.2. Низкоуровневая память: функции memXXX()
- 12.2.1. Заполнение памяти: memset()
- 12.2.2. Копирование памяти: memcpy(), memmove() и memccpy()
- 12.2.3. Сравнение блоков памяти: memcmp()
- 12.2.4. Поиск байта с данным значением: memchr()
- 12.3. Временные файлы
- 12.3.1. Создание временных имен файлов (плохо)
- 12.3.2. Создание и открывание временных файлов (хорошо)
- 12.3.3. Использование переменной окружения TMPDIR
- 12.4. Совершение самоубийства: abort()
- 12.5. Нелокальные переходы
- 12.5.1. Использование стандартных функций: setjmp() и longjmp()
- 12.5.2. Обработка масок сигналов: sigsetjmp() и siglongjmp()
- 12.5.3. Важные предостережения
- 12.6. Псевдослучайные числа
- 12.6.1. Стандартный С: rand() и srand()
- 12.6.2. Функции POSIX: random() и srandom()
- 12.6.3. Особые файлы /dev/random и /dev/urandom
- 12.7. Расширения метасимволов
- 12.7.1. Простое сопоставление с шаблоном: fnmatch()
- 12.7.2. Раскрытие имени файла: glob() и globfree()
- 12.7.3. Разворачивание слов оболочкой: wordexp() и wordfree()
- 12.8. Регулярные выражения
- 12.9. Рекомендуемая литература
- 12.10. Резюме
- Упражнения
- Глава 13 Интернационализация и локализация
- 13.1. Введение
- 13.2. Локали и библиотека С
- 13.2.1. Категории локалей и переменные окружения
- 13.2.2. Установка локали: setlocale()
- 13.2.3. Сравнение строк: strcoll() и strxfrm()
- 13.2.4. Числовое и денежное низкоуровневое форматирование: localeconv()
- 13.2.5. Высокоуровневое числовое и денежное форматирование: strfmon() и printf()
- 13.2.6. Пример: форматирование числовых значений в gawk
- 13.2.7. Форматирование значений даты и времени: ctime() и strftime()
- 13.2.8. Другие данные локали: nl_langinfo()
- 13.3. Динамический перевод сообщений программ
- 13.3.1. Установка текстового домена: textdomain()
- 13.3.2. Перевод сообщений: gettext()
- 13.3.3. Работа с множественными числами: ngettext()
- 13.3.4. Упрощение использования gettext()
- 13.3.5. Перестановка порядка слов с помощью printf()
- 13.3.6. Тестирование переводов в персональном каталоге
- 13.3.7. Подготовка интернационализированных программ
- 13.3.8. Создание переводов
- 13.4. Не могли бы вы произнести это для меня по буквам?
- 13.4.1. Широкие символы
- 13.4.2. Представления многобайтных символов
- 13.4.3. Языки
- 13.4.4. Заключение
- 13.5. Рекомендуемая литература
- 13.6. Резюме
- Упражнения
- Глава 14 Расширенные интерфейсы
- 14.1. Выделение выровненной памяти: posix_memalign() и memalign()
- 14.2. Блокировка файлов
- 14.2.1. Концепции блокировки файлов
- 14.2.2. Блокировка POSIX: fcntl() и lockf()
- 14.2.2.1. Описание блокировки
- 14.2.2.2. Установка и снятие блокировок
- 14.2.2.3. Предостережения по поводу блокировок
- 14.2.3. Блокирование BSD: flock()
- 14.2.4. Обязательная блокировка
- 14.3. Более точное время
- 14.3.1. Время в микросекундах: gettimeofday()
- 14.3.2. Файловое время в микросекундах: utimes()
- 14.3.3. Интервальные таймеры: setitimer() и getitimer()
- 14.3.4. Более точные паузы: nanosleep()
- 14.4. Расширенный поиск с помощью двоичных деревьев
- 14.4.1. Введение в двоичные деревья
- 14.4.2. Функции управления деревьями
- 14.4.3. Ввод элемента в дерево: tsearch()
- 14.4.4. Поиск по дереву и использование возвращенного указателя: tfind() и tsearch()
- 14.4.5. Обход дерева: twalk()
- 14.4.6. Удаление вершины дерева и удаление дерева: tdelete() и tdestroy()
- 14.5. Резюме
- Упражнения
- Часть 3 Отладка и заключительный проект
- Глава 15 Отладка
- 15.1. Сначала главное
- 15.2. Компиляция для отладки
- 15.3. Основы GDB
- 15.4. Программирование для отладки
- 15.4.1. Код отладки времени компилирования
- 15.4.1.1. Использование отладочных макросов
- 15.4.1.2. По возможности избегайте макросов с выражениями
- 15.4.1.3. При необходимости переставляйте код
- 15.4.1.4. Используйте вспомогательные функции отладки
- 15.4.1.5. По возможности избегайте объединений
- 15.4.2. Отлаживаемый код времени исполнения
- 15.5. Отладочные инструменты
- 15.5.1. Библиотека dbug — усовершенствованный printf()
- 15.5.2. Отладчики выделения памяти
- 15.5.2.1. GNU/Linux mtrace
- 15.5.2.2. Electric Fence
- 15.5.2.3. Отладка Malloc: dmalloc
- 15.5.2.4. Valgrind: многосторонний инструмент
- 15.5.2.5. Другие отладчики malloc
- 15.5.3. Современная lint
- 15.6. Тестирование программ
- 15.7. Правила отладки
- 15.8. Рекомендуемая литература
- 15.9. Резюме
- Упражнения
- Глава 16 Проект, связывающий все воедино
- Часть 4 Приложения
- Приложение А Научитесь программированию за десять лет
- Приложение В Лицензия Caldera для старой Unix
- Приложение С Общедоступная лицензия GNU
- Сноски из книги
- Содержание книги
- Популярные страницы
Похожие страницы
- 15.4. Программирование для отладки
- Linux программирование в примерах
- 1.1. Введение в объектно-ориентированное программирование
- InterBase Classic Server под Linux
- Каталог BIN в InterBase Classic Server для Linux
- Chapter 16. Commercial products based on Linux, iptables and netfilter
- Программирование на языке Пролог для искусственного интеллекта
- 1 Введение в Linux
- 4 Файловая система Linux
- Delphi. Учимся на примерах
- 1.2. Что такое Linux?
- 1.5.1. Red Hat Linux