Операционная система UNIX. Руководство программиста

     

Операционная система UNIX. Руководство программиста


ПРЕДИСЛОВИЕ
Круг читателей. Необходимые предварительные знания
Организация Руководства
Соглашения
Ссылки
Примеры
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
Предыстория



Простая формулировка философии системы UNIX
ИНСТРУМЕНТАРИЙ ОС UNIX. ГДЕ О НЕМ МОЖНО ПРОЧИТАТЬ
Какие инструменты описываются в данном Руководстве
Shell как средство изготовления прототипов
ТРИ ВИДА ПРОГРАММИСТОВ
Программисты-одиночки
Прикладные программисты
Системные программисты

ВЫБОР ЯЗЫКА ПРОГРАММИРОВАНИЯ
Поддерживаемые языки программирования
Язык C
Фортран
Паскаль
Ассемблер
Специализированные языки программирования
Awk(1)
Lex(1)
Yacc(1)

M4(1)
Bc(1) и dc(1)
Curses(3X)
КОГДА ПРОГРАММА НАПИСАНА
Компиляция и редактирование связей
Компиляция C-программ
Компиляция Фортран-программ
Диагностические сообщения при компиляции
Редактирование внешних связей
ИНТЕРФЕЙС МЕЖДУ ЯЗЫКОМ ПРОГРАММИРОВАНИЯ И ОС UNIX

Почему для иллюстрации интерфейса используется язык C
Как аргументы передаются в программу
Системные вызовы и библиотечные функции
Классификация системных вызовов и библиотечных функций
Где можно найти справочную информацию
Как системные вызовы и библиотечные функции используются в C-программах

Включаемые файлы
Библиотеки объектных файлов
Ввод/вывод
Стандартные открытые файлы
Именованные файлы
Низкоуровневый ввод/вывод и почему не стоит им пользоваться
Управление окружением и получение информации о его состоянии
Процессы

System(3S)
Каналы
Обработка ошибок
Сигналы и прерывания
АНАЛИЗ И ОТЛАДКА ПРОГРАММ
Пример программы

Cflow(1)
Ctrace(1)
Cxref(1)
Lint(1)
Prof(1)
Size(1)
Strip(1)

Sdb(1)
СРЕДСТВА ОРГАНИЗАЦИИ РАЗРАБОТКИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
Утилита make(1)
Работа с архивами
Использование системы SCCS программистами-одиночками
ТЕРМИНОЛОГИЯ

Открытие файлов для блокировки сегментов
Блокировка файлов
Блокировка и разблокирование сегментов
Получение информации о блокировке
Управление тупиковыми ситуациями

ВЫБОР СЛАБОЙ ИЛИ СИЛЬНОЙ БЛОКИРОВКИ
Сильная блокировка. Некоторые предупреждения
Блокировка сегментов и развитие системы UNIX
ИСПОЛЬЗОВАНИЕ РАЗДЕЛЯЕМЫХ БИБЛИОТЕК
Что такое разделяемая библиотека?
Разделяемые библиотеки ОС UNIX
Создание выполняемых файлов
Исходный текст программ

Использовать ли разделяемую библиотеку?
Еще об экономии памяти
Как разделяемые библиотеки экономят память?
Как ОС UNIX работает с разделяемыми библиотеками?
Как применение разделяемых библиотек может привести к увеличению расхода памяти?
Как узнать, нужны ли выполняемому файлу разделяемые библиотеки?
Отладка процессов, работающих с разделяемыми библиотеками

СОЗДАНИЕ РАЗДЕЛЯЕМОЙ БИБЛИОТЕКИ
Порядок создания
Выбор адресов секций команд и данных
Выбор маршрутного имени разделяемой библиотеки выполнения
Определение содержимого библиотеки
Подготовка исходного текста
Создание файла спецификаций библиотеки
Создание с помощью mkshlib(1) разделяемых библиотек сборки и выполнения
Пример

Рекомендации по разработке исходного текста для разделяемой библиотеки
Какие функции целесообразно включать в библиотеку?
Подготовка исходного текста для разделяемой библиотеки
Использование импортируемых имен

Обеспечение совместимости с архивной библиотекой
Настройка разделяемой библиотеки
Обеспечение совместимости с будущими версиями
РЕЗЮМЕ

Что такое curses?
Что такое terminfo?
Взаимодействие curses и terminfo
Другие компоненты пакета управления терминалом
ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ ПАКЕТА CURSES
Что нужно программе для работы с curses
Файл curses.h
Подпрограммы initscr( ), refresh( ) и endwin( )
Компиляция программы, которая использует curses
Выполнение программы, которая использует curses

Операционная система UNIX. Руководство программиста

Еще о строках, столбцах и подпрограмме initscr( )
Еще об окнах и подпрограмме refresh( )
Вывод

Ввод
Атрибуты вывода
Звонки, свист, вспышки
Опции ввода
Работа с окнами

Подпрограммы wnoutrefresh( ) и doupdate( )
Новые окна
Прочие возможности пакета curses
Линии на экране и прочая графика
Использование программируемых меток
Работа с несколькими терминалами сразу
ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ ПАКЕТА TERMINFO

Что нужно программе для работы с terminfo
Компиляция и выполнение программ, которые используют terminfo
Пример программы, работающей с terminfo
ИСПОЛЬЗОВАНИЕ БАЗЫ ДАННЫХ TERMINFO
Создание описания терминала
Название терминала
Выяснение характеристик терминала
Указание характеристик терминала

Компиляция описания
Тестирование описания
Печать и сравнение описаний в базе данных terminfo
Преобразование termcap-описания в terminfo-описание
ПРИМЕРЫ ПРОГРАММ, РАБОТАЮЩИХ С CURSES
Программа editor

Программа highlight
Программа scatter
Программа show
Программа two
Программа window
ОПРЕДЕЛЕНИЯ И СОГЛАШЕНИЯ

Секции
Физические и виртуальные адреса
Целевой компьютер
ЗАГОЛОВОК ФАЙЛА
Магическое число
Флаги
Описание заголовка файла
ВСПОМОГАТЕЛЬНЫЙ ЗАГОЛОВОК СИСТЕМЫ UNIX
A.out - стандартный заголовок системы UNIX
Описание вспомогательного заголовка

ЗАГОЛОВКИ СЕКЦИЙ
Описание заголовка секции
Заголовок секции неинициализированных данных
ИНФОРМАЦИЯ О НАСТРОЙКЕ ССЫЛОК
Описание элемента таблицы настройки ссылок
ИНФОРМАЦИЯ О НОМЕРАХ СТРОК
Описание элемента таблицы номеров строк
ТАБЛИЦА ИМЕН

Специальные имена
Внутренние блоки
Имена и функции
Элементы таблицы имен
Тексты имен
Классы памяти
Классы памяти специальных имен
Поле значения имени
Поле номера секции
Номера секций и классы памяти

Поле типа
Связь между типом и классом памяти
Описание элемента таблицы имен
Вспомогательные элементы таблицы имен
Имя файла
Секция
Начало структуры, объединения или перечисления
Конец структуры
Функция
Массив

Конец блока или функции
Начало блока или функции
Имена, связанные со структурой, объединением или перечислением
Описание вспомогательного элемента
ТАБЛИЦА ЦЕПОЧЕК
ПРОГРАММЫ ДОСТУПА К ОБЪЕКТНЫМ ФАЙЛАМ ОБЫЧНОГО ФОРМАТА
ОСНОВНЫЕ ПОНЯТИЯ
Конфигурация памяти

Адреса
Связывание
Объектный файл
Выражения
Оператор присваивания
Описание конфигурации памяти
Предложения определения секций
Спецификации файлов
Указание адреса загрузки секции
Выравнивание выходной секции

Группировка выходных секций
Создание пустот в выходных секциях
Создание и определение имен при редактировании связей
Размещение секций в именованных областях памяти
Инициализация пустот и секций .bss
Определение точки входа
Использование библиотек объектных файлов
Обход неконфигурируемых областей памяти

Алгоритм размещения
Инкрементальное редактирование связей
Секции DSECT, COPY, INFO и OVERLAY
Выравнивание секций в выходном файле
Ненастраиваемые входные файлы
СИНТАКСИС УПРАВЛЯЮЩЕГО ЯЗЫКА РЕДАКТОРА СВЯЗЕЙ
ОЧЕРЕДИ СООБЩЕНИЙ

Использование очередей сообщений
Создание очередей сообщений
Использование msgget
Программа-пример
Управление очередями сообщений
Использование msgctl

Операции над очередями сообщений
Использование операций
СЕМАФОРЫ
Использование семафоров
Создание множеств семафоров

Операционная система UNIX. Руководство программиста

Управление семафорами
Использование semctl

Операции над множествами семафоров
Использование semop
РАЗДЕЛЯЕМЫЕ СЕГМЕНТЫ ПАМЯТИ
Использование разделяемых сегментов памяти
Создание разделяемых сегментов памяти
Управление разделяемыми сегментами памяти
Использование shmctl

Операции над разделяемыми сегментами памяти
ЗАПУСК УТИЛИТЫ LINT
ТИПЫ СООБЩЕНИЙ LINT'А
Неиспользуемые переменные и функции
Информация об определениях/использованиях значений

Поток управления
Значения функций
Контроль типов
Явные преобразования типов
Машинно-зависимое использование символов
Присваивание целым переменным long-значений
Странные конструкции
Устаревший синтаксис
Выравнивание указателей
Многократные использования и побочные эффекты

ОСНОВНЫЕ ВОЗМОЖНОСТИ
ФАЙЛЫ ОПИСАНИЙ И ПОДСТАНОВКИ
Комментарии
Строки продолжения
Макроопределения
Общий вид файла описаний

Информация о зависимостях
Исполняемые команды
Усовершенствования $*, $@, $
Выходные преобразования макросов
РЕКУРСИВНЫЕ MAKE-ФАЙЛЫ
Суффиксы и правила трансформации
Подразумеваемые правила
Архивные библиотеки
ИМЕНА SCCS-ФАЙЛОВ (ТИЛЬДА)

Пустой суффикс
Make-файлы в рамках SCCS
Динамические параметры зависимостей
ЗАПУСК УТИЛИТЫ MAKE
Командная строка
Переменные окружения
СОВЕТЫ И ПРЕДОСТЕРЕЖЕНИЯ
ВСТРОЕННЫЕ ПРАВИЛА

ЯЗЫК ПРОГРАММИРОВАНИЯ AWK
Структура программы
Лексемы
Числовые константы
Текстовые константы
Ключевые слова
Идентификаторы
Знаки операций
Лексемы для работы с записями и полями
Разделитель записей

Разделитель полей
Записи, состоящие из нескольких строк
Выходные разделители записей и полей
Лексемы, используемые для группировки
Первичные выражения
Переменные
Функции

Термы
Бинарные термы
Унарные термы
Переменные с приращением
Конкатенация термов
Выражения-присваивания
ПРИМЕНЕНИЕ AWK'А
Запуск программ на выполнение

Ввод: записи и поля
Ввод из файла
Ввод из командной строки
Вывод на печать
Вывод в различные файлы
Вывод в каналы
ШАБЛОНЫ
BEGIN и END
Выражения сравнения

Регулярные выражения
Комбинации шаблонов
Шаблоны-диапазоны
ДЕЙСТВИЯ
Переменные, выражения и присваивания
Инициализация переменных
Переменные-поля
Конкатенация цепочек
Специальные переменные

Типы данных
Массивы
СПЕЦИФИЧЕСКИЕ ВОЗМОЖНОСТИ
Встроенные функции
Управляющие конструкции
Генерация отчетов
Взаимодействие с shell'ом
Многомерные массивы

ОБЗОР ИСПОЛЬЗОВАНИЯ LEX'А
РАЗРАБОТКА LEX-ПРОГРАММ
Основные элементы правил lex'а
Спецификации
Более сложные элементы lex'а
Некоторые специфические свойства

Секция определений
Секция подпрограмм
Совместное использование lex'а и yacc'а
ВЫПОЛНЕНИЕ LEX'А В СИСТЕМЕ UNIX

ОСНОВНЫЕ СПЕЦИФИКАЦИИ
Лексический анализ
АЛГОРИТМ СИНТАКСИЧЕСКОГО РАЗБОРА

НЕОДНОЗНАЧНОСТИ И КОНФЛИКТЫ

Операционная система UNIX. Руководство программиста

СТАРШИНСТВО ОПЕРАЦИЙ

ОКРУЖЕНИЕ YACC'А
СОВЕТЫ ПО ПОДГОТОВКЕ СПЕЦИФИКАЦИЙ
Стиль
Левая рекурсия
Уловки анализа лексики
Зарезервированные слова
БОЛЕЕ СЛОЖНЫЕ ВОПРОСЫ
Моделирование действий ошибка и успех
Доступ к значениям завершенных правил

Использование значений произвольных типов
ВХОДНОЙ СИНТАКСИС YACC'А
Простой пример
Более сложный пример

ЛЕКСИЧЕСКИЕ СОГЛАШЕНИЯ
Идентификаторы (имена)
Константы
Целые константы
Длинные целые константы
Символьные константы
Вещественные константы
Перечислимые константы

Форма описания синтаксиса языка
КЛАСС ПАМЯТИ И ТИП
Класс памяти
Тип
Объекты и л_значения
ПРЕОБРАЗОВАНИЯ В ОПЕРАЦИЯХ
Символы и целые
Одинарная и двойная точность
Вещественные и целочисленные значения

Указатели и целые
Беззнаковые
Арифметические преобразования
Пустое значение
ВЫРАЖЕНИЯ И ОПЕРАЦИИ
Унарные операции
Мультипликативные операции

Аддитивные операции
Операции сдвига
Операции отношения
Операции равенства
Побитная операция И
Побитная операция исключающее ИЛИ
Побитная операция ИЛИ
Логическая операция И
Логическая операция ИЛИ
Условная операция

Операции присваивания
Операция запятая
ОПИСАНИЯ
Спецификаторы класса памяти
Спецификаторы типа
Описатели
Смысл описателей
Описания структур и объединений

Описания перечислимых типов
Инициализация
Имена типов
Неявные описания
Определяемые типы
ОПЕРАТОРЫ
Оператор-выражение
Составной оператор (блок)
Условный оператор if

Оператор цилка while
Оператор цикла do
Оператор цикла for
Оператор выбора switch
Оператор break
Оператор continue
Оператор возврата return
Оператор перехода goto
Оператор с меткой
Пустой оператор

ВНЕШНИЕ ОПРЕДЕЛЕНИЯ
Внешние определения функций
Внешние определения данных
ПРАВИЛА ВИДИМОСТИ
Лексическая видимость
Видимость внешних объектов
КОМАНДНЫЕ СТРОКИ ПРЕПРОЦЕССОРА
Замена лексем
Включение файлов
Условная компиляция

Управление строками
Управление версиями
ЕЩЕ О ТИПАХ
Структуры и объединения
Массивы, указатели и индексирование
Явные преобразования указателей
КОНСТАНТНЫЕ ВЫРАЖЕНИЯ
ВОПРОСЫ МОБИЛЬНОСТИ
СВОДКА СИНТАКСИСА

Препроцессор