Предисловие
Часть 1. Файлы и пользователи
Глава 1. Введение
1.1. Модель файловой системы Linux/Unix
1.1.1. Файлы и права доступа
1.1.2. Каталоги и имена файлов
1.1.3. Исполняемые файлы
1.1.4. Устройства
1.2. Модель процессов Linux/Unix
1.2.1. Каналы: сцепление процессов
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.1.1. Соглашения POSIX
2.1.2. Длинные опции GNU
2.2. Базовая обработка командной строки
2.2.1. Программа echo V7
2.3. Разбор опций: getopt() и getopt_long()
2.3.1. Опции с одним символом
2.3.2. GNU getopt() и порядок опций
2.3.3. Длинные опции
2.4. Переменные окружения
2.4.1. Функции управления окружением
2.4.2. Окружение в целом: environ
2.4.3. GNU env
2.5. Резюме
Упражнения
Глава 3. Управление памятью на уровне пользователя
3.1. Адресное пространство Linux/Unix
3.2. Выделение памяти
3.2.1. Библиотечные вызовы: malloc(), calloc(), realloc(), free()
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.3.1. Значения errno
4.3.2. Стиль сообщения об ошибках
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.3.1. Базовое чтение каталогов
5.3.2. Функции размещения каталогов BSD
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.4. Преобразование разложенного времени в time_t
6.1.5. Получение сведений о часовом поясе
6.2. Функции сортировки и поиска
6.2.1. Сортировка: qsort()
6.2.2. Бинарный поиск: bsearch()
6.3. Имена пользователей и групп
6.3.1. База данных пользователей
6.3.2. База данных групп
6.4. Терминалы: isatty()
6.5. Рекомендуемая литература
6.6. Резюме
Упражнения
Глава 7. Соединяя все вместе: ls
7.1. Опции V7 ls
7.2. Код V7 ls
7.3. Резюме
Упражнения
Глава 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.3.1. Стиль POSIX: statvfs() и fstatvfs()
8.3.2. Стиль Linux: statfs() и fstatfs()
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.2. Идентификация процесса: getpid() и getppid()
9.1.3. Установка приоритетов процесса: nice()
9.1.4. Запуск новой программы: семейство exec()
9.1.5. Завершение процесса
9.1.6. Использование статуса завершения порожденного процесса
9.2. Группы процессов
9.2.1. Обзор управления заданиями
9.2.2. Идентификация группы процессов: getpgrp() и getpgid()
9.2.3. Установка группы процесса: setpgid() и setpgrp()
9.3. Базовое межпроцессное взаимодействие: каналы и очереди FIFO
9.3.1. Каналы
9.3.2. Очереди 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.3.1. Функция signal()
10.3.2. Программная отправка сигналов: raise()
10.4. Обработчики сигналов в действии
10.4.1. Традиционные системы
10.4.2. BSD и GNU/Linux
10.4.3. Игнорирование сигналов
10.4.4. Системные вызовы, допускающие повторный запуск
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.1.1. Действительные и эффективные ID
11.1.2. Биты Setuid и Setgid
11.2. Получение ID пользователя и группы
11.3. Проверка для действительного пользователя: access()
11.4. Проверка для эффективного пользователя: euidaccess() (GLIBC)
11.5. Установка дополнительных битов доступа для каталогов
11.5.1. Группа по умолчанию для новых файлов и каталогов
11.5.2. Каталоги и "липкий" бит
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.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. Отладка
Глава 16. Проект, связывающий все воедино
Глава 15. Отладка
15.1. Сначала главное
15.2. Компиляция для отладки
15.3. Основы GDB
15.3.1. Запуск GDB
15.3.2. Установка контрольных точек, пошаговое выполнение и отслеживаемые точки
15.4. Программирование для отладки
15.4.1. Код отладки времени компилирования
15.4.2. Отлаживаемый код времени исполнения
15.5. Отладочные инструменты
15.5.1. Библиотека dbug - усовершенствованный printf()
15.5.2. Отладчики выделения памяти
15.5.3. Современная lint
15.6. Тестирование программ
15.7. Правила отладки
15.8. Рекомендуемая литература
15.9. Резюме
Упражнения
Глава 16. Проект, связывающий все воедино
16.1. Описание проекта
16.2. Рекомендуемая литература
Часть 4. Приложения
Приложение A. Научитесь программированию за десять лет 605
Приложение B. Старая лицензия Unix Caldera 610
Приложение C. Общедоступная лицензия GNU 612
Приложение А. Научитесь программированию за десять лет
Почему каждый в такой спешке?
Научитесь программированию за десять лет
Ссылки
Ответы
Сноски
Приложение В. Лицензия Caldera для старой Unix
Приложение С. Общедоступная лицензия GNU
Преамбула
Права и обязанности при копировании, распространении и модификации
Отказ от гарантий
КОНЕЦ ОПИСАНИЯ ПРАВ И ОБЯЗАННОСТЕЙ
Как применить эти условия договора к своим новым программам
Пример использования
Предметный указатель