^
Начало
Установить закладку
+ Настройки
14 | 16 | 18 | 20 | 22 | 24
Ширина текста:
50% | 60% | 70% | 80% | 90% | 100%
Шрифт:
Цвет текста:
Установить
Цвет фона:
Установить
Сбросить настройки
Linux
программирование в примерах
Предисловие
Часть 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.3.3.1. Таблица длинных опций
2.3.3.2. Длинные опции в стиле POSIX
2.3.3 3. Сводка возвращаемых значений getopt_long()
2.3.3.4. GNU getopt() или getopt_long() в программах пользователей
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.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.3.1. Значения errno
4.3.2. Стиль сообщения об ошибках
4.4. Ввод и вывод
4.4.1. Понятие о дескрипторах файлов
4.4.2. Открытие и закрытие файлов
4.4.2.1. Отображение переменных FILE* на дескрипторы файлов
4.4.2.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.3.1. Программа GNU link
5.1.3.2. Точка и точка-точка
5.1.4. Переименование файлов
5.1.5. Удаление файла
5.1.5.1. Удаление открытых файлов
5.1.5.2. Использование ISO С: remove()
5.1.6. Символические ссылки
5.2. Создание и удаление каталогов
5.3. Чтение каталогов
5.3.1. Базовое чтение каталогов
5.3.1.1. Анализ переносимости
5.3.1.2. Элементы каталогов Linux и BSD
5.3.2. Функции размещения каталогов BSD
5.4. Получение информации о файлах
5.4.1. Типы файлов Linux
5.4.2. Получение информации о файле
5.4.3. Только Linux: указание файлового времени повышенной точности
5.4.4. Определение типа файла
5.4.4.1. Сведения об устройстве
5.4.4.2. Возвращаясь к V7 cat
5.4.5. Работа с символическими ссылками
5.5. Смена владельца, прав доступа и времени изменения
5.5.1. Смена владельца файла: chown(), fchown() и lchown()
5.5.2. Изменение прав доступа: chmod() и fchmod()
5.5.3. Изменение временных отметок: utime()
5.5.3.1. Подделка utime(file, NULL)
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.1.5.1. Системы BSD: timezone(), не timezone
6.2. Функции сортировки и поиска
6.2.1. Сортировка: qsort()
6.2.1.1. Пример: сортировка сотрудников
6.2.1.2. Пример: сортировка содержимого каталога
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.4.3.1. Интерфейс nftw()
8.4.3.2. Функция обратного вызова 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.3.1. POSIX против действительности
9.1.4. Запуск новой программы: семейство exec()
9.1.4.1. Системный вызов execve()
9.1.4.2. Функции-оболочки: execl() и др.
9.1.4.3. Имена программ и argv[0]
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.1.6.1. Использование функций POSIX: wait() и waitpid()
9.1.6.2. Использование функций BSD: wait3() и wait4()
9.2. Группы процессов
9.2.1. Обзор управления заданиями
9.2.2. Идентификация группы процессов: getpgrp() и getpgid()
9.2.3. Установка группы процесса: setpgid() и setpgrp()
9.3. Базовое межпроцессное взаимодействие: каналы и очереди FIFO
9.3.1. Каналы
9.3.1.1. Создание каналов
9.3.1.2. Буферирование каналов
9.3.2. Очереди FIFO
9.4. Управление дескрипторами файлов
9.4.1. Дублирование открытых файлов: dup() и dup2()
9.4.2. Создание нелинейных конвейеров: /dev/fd/XX
9.4.3. Управление атрибутами файла: fcntl()
9.4.3.1. Флаг close-on-exec
9.4.3.2. Дублирование дескриптора файла
9.4.3.3. Работа с флагами статуса файла и режимами доступа
9.4.3.4. Неблокирующий ввод/вывод для каналов и FIFO
9.4.3.5. Сводка 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.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.1.1. Труднее, но с большим контролем: alarm() и SIGALARM
10.8.1.2. Простой и легкий: sleep()
10.8.2. Сигналы, управляющие заданиями
10.8.3. Родительский надзор: три различные стратегии
10.8.3.1. Плохие родители: полное игнорирование потомков
10.8.3.2. Снисходительные родители: минимальный надзор
10.8.3.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. Низкоуровневая память: функции mem
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.4.1. Переносимые программы: "gettext.h"
13.3.4.2. Только GLIBC: <libintl.h>
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.3.1. Запуск GDB
15.3.2. Установка контрольных точек, пошаговое выполнение и отслеживаемые точки
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.4.2.1. Добавляйте отладочные опции и переменные
15.4.2.2. Используйте специальные переменные окружения
15.4.2.3. Добавьте код журналирования
15.4.2.4. Файлы отладки времени исполнения
15.4.2.5. Добавьте специальные ловушки для контрольных точек
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
Проект, связывающий все воедино
16.1. Описание проекта
16.2. Рекомендуемая литература
Часть 4
Приложения
Приложение А
Научитесь программированию за десять лет
Почему каждый в такой спешке?
Научитесь программированию за десять лет
Ссылки
Ответы
Сноски
Приложение В
Лицензия Caldera для старой Unix[194]
Приложение С
Общедоступная лицензия GNU[195]
Как применить эти условия договора к своим новым программам
Пример использования
