Открытые системы 1 Аблов Игорь Васильевич Кафедра информационных технологий.

Презентация:



Advertisements
Похожие презентации
Лекция 4 Программирование на Паскале. Элементы языка Турбо Паскаль 7.0. Типы данных. Управляющие конструкции.
Advertisements

Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Файловый тип данных Файл – это область памяти на внешнем носителе, в которой хранится некоторая информация. В языке Паскаль файл представляет собой последовательность.
Глава 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор присваивания Простой и составной операторы Условный оператор Оператор множественного выбора Оператор цикла с предусловием.
Массивы 9 класс. Основные теоретические сведения Примеры решения задач.
Файловый тип данных Turbo Pascal Операции для работы с файлами 11 класс.
Работа с файлами Сазонов Д.О. ПМиЭММ Часть 2. Тема занятия: Работа с файлами через потоки Для реализации файлового ввода/вывода, необходимо включить в.
План-конспект урока (информатика и икт, 9 класс) по теме: Переменные:тип, имя, значение
Министерство образования Республики Беларусь Белорусский государственный университет Управляющие структуры языков программирования.
6.5. Создание реляционной БД в среде СУБД ACCESS Общие сведения Реляционные отношения в СУБД ACCESS представлены в двух формах: в виде таблиц и в виде.
Тест классы По программированию Pascal.
Переменные и операторы УРОК 2. Переменные ПЕРЕМЕННАЯ – ?... контейнер для хранения данных. Переменная имеет имя – это….? последовательность букв, цифр.
Объектно-ориентированный язык программирования. Переменная - эта поименованная ячейка памяти, хранящая какое-либо одно значение (одно число, один фрагмент.
Операционные системы Подготовила Подготовила студентка студентка 1 курса группы Э курса группы Э-108 Шпудейко Кристина Шпудейко Кристина.
Основы программирования на Бейсике Массивы. Задание: Найти все 3-хзначные числа, заканчивающихся на 2, 4, 8 и делящихся на 6. Ответ: CLS FOR I=100 TO.
Физические модели баз данных Файловые структуры, используемые для хранения информации в базах данных.
Pascal 1 Основы языка Паскаль Информатика и ИКТ Смирнов М.В. МКО ООШ п. Климковка Белохолуницкого района Кировской области.
Что такое связи между таблицами В реляционной базе данных связи позволяют избежать избыточности данных. Например, в ходе создания базы данных, содержащей.
Потоки (файлы) Функции и типы для работы с потоками в стиле С описаны в модуле stdio.h. В отличие от Паскаля в С с потоком не связан тип данных. Поток.
Проектирование архитектуры ИСО 1. UML 2 Структура определения языка 4.
Транксрипт:

Открытые системы 1 Аблов Игорь Васильевич Кафедра информационных технологий

Открытые системы 2 Определение HP Открытая система - это совокупность разнородных компьютеров, объединенных сетью, которые могут работать как единое интегрированное целое, независимо от того: где они расположены; как в них представлена информация; кем они изготовлены; под управлением какой операционной системы они работают

Открытые системы 3 Определение Posix Открытая система - это система, реализующая открытые спецификации на интерфейсы, службы и форматы данных, достаточные для того, чтобы обеспечить: возможность переноса (мобильность) прикладных систем, разработанных должным образом, с минимальными изменениями на широкий диапазон систем; совместную работу (интероперабельность) с другими прикладными системами на локальных и удаленных платформах; взаимодействие с пользователями в стиле, облегчающем последним переход от системы к системе (мобильность пользователей).

Открытые системы 4 Модели открытых систем Референсная модель ВОС (OSI/ISO) Модель MIC Модель OSE/RF Модель MUSIC

Открытые системы 5 MIC Модель открытой системы, разработанная AFUU (Французская Ассоциация пользователей UNIX и открытых систем) и AFNOR (Французская Ассоциация стандартизации), названа MIC (Model for Interactions between Components) - модель взаимодействия между компонентами, авторы также называют ее конвергентой моделью. Эта модель представляет собой попытку объединить различные подходы к классификации компонент среды. Она строится в виде матрицы 7х4, столбцы которой соответствуют видам взаимодействия (обслуживания) в системе: взаимодействие с пользователем, системные средства, доступ к данным, коммуникационные средства.

Открытые системы 6 OSE/RF Рабочей группой POSIX P Института инженеров по электронике и электротехнике (IEEE) предложена Референсная Модель Среды Открытых Систем (OSE/RF), которая используется в США. В отличие от рассмотренных выше европейских моделей, данная модель предусматривает разбиение среды на три составных части: прикладное обеспечение; прикладная платформа; внешняя среда.

Открытые системы 7 OSE/RF (прикладное обеспечение) В рамках этой модели под прикладным обеспечением понимаются собственно прикладные программы, данные, а также документация и средства обучения пользователей.

Открытые системы 8 OSE/RF ( прикладная платформа ) Прикладная платформа состоит из аппаратной платформы и программного обеспечения. Сюда входят: операционная система, компиляторы, СУБД, графические системы, т.е. все средства, составляющие операционную среду для прикладных систем.

Открытые системы 9 OSE/RF ( внешняя среда ) К внешней среде относятся все системные элементы, которые являются внешними по отношению к прикладной платформе и прикладному обеспечению. Это утилиты и подсистемы, реализуемые на других (удаленных) платформах, а также периферийные устройства.

Открытые системы 10 OSE/RF ( ПО-ПП ) Взаимодействие между прикладным обеспечением и прикладной платформой осуществляется с помощью Прикладных Программных Интерфейсов (API). В области API предусматривается четыре интерфейсных элемента для взаимодействия с: системными службами; коммуникационными службами; информационными службами; службами, обеспечивающими человеко- машинный интерфейс.

Открытые системы 11 OSE/RF ( ПП-ВС ) Взаимодействие между прикладной платформой и внешней средой производится через область интерфейсов внешней среды (EEI). В этой области предусматривается три типа интерфейсов для взаимодействия с: коммуникационными службами; информационными службами; службами, обеспечивающими человеко- машинный интерфейс.

Открытые системы 12 MUSIC Модель MUSIC была предложена Центральным Агентством по вычислительной технике и телекоммуникации (CCTA) Великобритании. MUSIC - это акроним от английских названий основных элементов модели: M - Management; U - User interface; S - Service interface for programs; I - Information and data formats; C - Communications interfaces.

Открытые системы 13 Модель MUSIC Модель MUSIC содержит пять групп компонентов, из которых строятся открытые системы: управление (Management) - функции системной администрации, безопасности, управления ресурсами, конфигурацией, сетевое управление; пользовательский интерфейс (User Interface) - интерфейс пользователя с прикладными программами и со средой разработки приложений; системные интерфейсы для программ (Service Interface for Programs) - интерфейсы между прикладными программами и между прикладными программами и операционной системой, в частности API (Application Programs Interface); форматы информации и данных; интерфейсы коммуникаций.

Открытые системы 14 Компоненты модели MUSIC

Открытые системы 15 Компоненты профиля открытых систем

Открытые системы 16 Администрация (Management) Элемент, названный Management, включает следующие функциональные компоненты: системная администрация; защита данных и надежность системы; управление работой в сетях; учет использования ресурсов и поддержка конфигурации системы.

Открытые системы 17 Пользовательский интерфейс (User Interface) Элемент U (User Interface) распадается на две основных компоненты. Первая - представляет группу взаимодействий, которые имеют место между пользователем и прикладной системой в целом (прикладная программа и системные средства, включая аппаратуру), вне зависимости от конкретного типа прикладной системы, которая используется. Вторая компонента соответствует действиям пользователя при взаимодействии с собственно прикладной программой.

Открытые системы 18 Обслуживание в системе (Service interfaces for programs) Элемент S (Service interfaces for programs) включает интерфейсы для взаимодействия прикладной программы с системными средствами ЭВМ, на которой эта программа выполняется (аппаратура и программы). Функции этого типа реализуются, главным образом, программами операционной системы.

Открытые системы 19 Обслуживание доступа к информации и форматы данных (Information and Data Formats) Элемент I (Information and Data Formats) объединяет средства, обеспечивающие доступ к данным и обмен данными. Функции, которые реализуются в рамках этого элемента, можно разбить на три основные подгруппы: определение типов и способов представления данных, и доступ к ним в прикладных программах; хранение и управление данными; поддержка форматов обмена данными.

Открытые системы 20 Коммуникационные интерфейсы (Communications interfaces) Элемент C (Comunications interfaces). Компоненты, объединяемые в этот элемент, обеспечивают взаимодействие через локальные и глобальные сети. Интерфейсы, которые соответствуют элементу C, обеспечивают возможность соединения в неоднородных сетях.

Открытые системы 21 Профили стандартов Открытых Систем Интеграция компонентов в открытой системе должна следовать профилям стандартов на интерфейсы этих компонент. Профили выполняют три наиболее существенные и взаимосвязанные функции: они дают четкую основу для связи между характеристиками открытых систем, которые нужны пользователю или прикладной системе; профиль задает ориентиры для построения прикладных программ и систем; профиль обеспечивает логическую группировку стандартов, которые разработчики могут использовать, чтобы упростить задачу по ориентации приложений для конкретной среды.

Открытые системы 22 Технологический цикл построения открытых систем Элемент, названный Management, включает следующие функциональные компоненты: системная администрация; защита данных и надежность системы; управление работой в сетях; учет использования ресурсов и поддержка конфигурации системы.

Открытые системы 23 Стадии внедрения среды открытых систем 1.Определение целей деятельности. 2.Идентификация требований к прикладной системе. 3.Подготовка профиля для описания набора свойств среды, требуемых для поддержки приложения. 4.Приобретение или создание программного обеспечения, которое соответствует выбранному профилю. 5.Проверка приложения на соответствие характеристикам открытых систем. 6.Проверка на соответствие целям деятельности. 7.Повторение последовательности действий.

Открытые системы 24 Уровни соответствия приложений стандартам РОSIX

Открытые системы 25 Выводы: 1.Технология открытых систем представляет в настоящее время основное направление информационных технологий, определяющее эффективность информационных систем. 2.Технология открытых систем касается систем всех уровней и назначений. 3.В развитии и применении технологии открытых систем заинтересованы все категории участников информационных технологий: –пользователи; –производители платформ - базовых средств вычислительной техники; –разработчики систем; –разработчики стандартов. 4.Экономический эффект от использования технологии открытых систем оценивается в миллиарды долларов. 5.Основным конечным продуктом при развитии отрытых систем служат функциональные профили стандартов, представляющие собой набор стандартов для данной области применения. 6.Процесс развития и применения отрытых систем носит непрерывный характер, содержит много теоретических и практических проблем, в нем участвуют сотни организаций различного статуса. 7.Даже в странах с рыночной экономикой процесс развития и применения открытых систем осуществляется под руководством федерального правительства.

Открытые системы 26 Основные идеи стандарта POSIX Стандарт POSIX описывает множество базовых, системных сервисов, необходимых для функционирования прикладных программ. Доступ к ним предоставляется посредством интерфейса, специфицированного для языка C, командного языка и общеупотребительных служебных программ. У каждого интерфейса есть две стороны: вызывающая и вызываемая. Стандарт POSIX ориентирован в первую очередь на вызывающую. Его цель - сделать приложения мобильными на уровне исходного языка.

Открытые системы 27 Основные понятия стандарта POSIX Стандарт POSIX в редакции 2003-го года - весьма обширный, многогранный документ, где подробно рассматриваются следующие категории системных компонентов: средства разработки; сетевые средства; средства реального времени; потоки управления; математические интерфейсы; пакетные сервисы; заголовочные файлы; унаследованные интерфейсы.

Открытые системы 28 Профиль Профилем будем называть набор опций, описывающих необязательные возможности. Соответствие профилю означает соответствие стандарту POSIX и поддержку заданных возможностей. Разумным образом выбранные профили позволяют учитывать потребности представительных классов пользователей и/или приложений.

Открытые системы 29 Основные понятия операционных систем, соответствующих стандарту POSIX пользователь; файл; процесс; терминал; хост; узел сети; время; языково-культурная среда. В тексте стандарта POSIX содержатся следующие пояснения основных понятий вместе со ссылками на атрибуты и операции. У пользователя есть имя и числовой идентификатор. Файл - объект, допускающий чтение и/или запись и имеющий такие атрибуты, как права доступа и тип. К числу последних относятся обычный файл, символьный и блочный специальные файлы, канал, символьная ссылка, сокет и каталог. Реализация может поддерживать и другие типы файлов. Процесс - адресное пространство вместе с выполняемыми в нем потоками управления, а также системными ресурсами, которые этим потокам требуются. Терминал (или терминальное устройство) - символьный специальный файл, подчиняющийся спецификациям общего терминального интерфейса. Сеть - совокупность взаимосвязанных хостов. Языково-культурная среда - часть пользовательского окружения, зависящая от языковых и культурных соглашений.

Открытые системы 30 Среда компиляции POSIX- совместимых приложений Важнейшая часть среды компиляции - заголовочные (или включаемые) файлы, содержащие прототипы функций, определения символических констант, макросов, типов данных, структур и т.п. Для каждой описанной в стандарте POSIX функции определено, какие заголовочные файлы должны быть включены использующим ее приложением (обычно требуется один файл).

Открытые системы 31 Макрос _POSIX_C_SOURCE Основным макросом проверки возможностей является _POSIX_C_SOURCE. Среди требований к приложениям, строго соответствующим стандарту POSIX, фигурирует необходимость определения символической константы _POSIX_C_SOURCE со значением L до включения каких-либо заголовочных файлов. Таким образом POSIX- совместимое приложение заявляет, что ему нужны POSIX- имена. Примером использования макроса _POSIX_C_SOURCE во включаемых файлах ОС Linux может служить фрагмент: #if defined(_REENTRANT) || (_POSIX_C_SOURCE - 0 >= L)#define LIBXML_THREAD_ENABLED#endif

Открытые системы 32 Мобильность POSIX- совместимых приложений Мобильность приложений, соответствующих стандарту POSIX, принципиально достижима благодаря двум основным факторам. Во-первых - это наличие огромного числа стандартизованных системных сервисов, а во-вторых - возможность динамического выяснения характеристик целевой платформы и подстройки под них приложения. Приложения, соответствующие стандарту POSIX, могут быть одно- и многопроцессными, с возможностью динамической адаптации конфигурации к свойствам целевой платформы.

Открытые системы 33 Основные понятия языка shell Основные понятия языка shell на лексическом уровне: Под пробелом в дальнейшем понимается не только собственно пробел, но также и символ табуляции. Слово - это лексема, отличная от знака операции. Имя - последовательность букв, цифр, символов подчеркивания, начинающаяся с буквы или подчеркивания. Параметр - имя, цифра или любой из символов #, ?, -, $, !. Комментарий - лексема, начинающаяся с символа #, а также вся последующая часть строки. На синтаксическом уровне различаются несколько видов команд: Простая команда - последовательность полей с разделителями (обычно пробелами) между ними. Первое поле определяет имя команды, которая будет выполняться; оставшиеся поля, за исключением присваиваемых параметрам и перенаправления ввода/вывода (см. далее), передаются команде в качестве аргументов. Имя команды передается как аргумент 0. Значение простой команды - ее код завершения. Команда - это либо простая команда, либо одна из управляющих конструкций (см. далее). Кодом завершения команды является код завершения последней выполненной простой команды. Конвейер - последовательность команд, разделенных знаком |. Стандартный вывод всех команд, кроме последней, направляется на стандартный ввод следующей команды конвейера. Каждая команда выполняется как самостоятельный процесс; shell ожидает завершения последней команды, код завершения которой становится кодом завершения конвейера. Формально будем считать простую команду частным случаем конвейера. Список - последовательность из одного или нескольких разделенных символами ;, &, && или || конвейеров, она может заканчиваться символами ; или &. Из четырех указанных операций ; и & имеют равные приоритеты, меньшие, чем у && и ||. Приоритеты последних также равны между собой. Символ ; означает, что конвейеры будут выполняться последовательно, а & - параллельно (т. е. shell не ожидает завершения конвейера). Операция && (||) означает, что список, следующий за ней, будет выполняться лишь в том случае, если код завершения предыдущего конвейера нулевой (ненулевой). В списке в качестве разделителя конвейеров вместо символа ; можно использовать символ перевода строки. Командная строка - строка текста на языке shell. Shell-процедура - файл, содержащий программу на языке shell. Далее при описании синтаксиса конструкций языка shell и способа вызова служебных программ будут использоваться следующие соглашения: в квадратные скобки заключаются необязательные части конструкций; многоточие означает повторение предыдущей части конструкции произвольное число раз.

Открытые системы 34 Конвейеры и примеры их использования Конвейер - одна из самых красивых конструкций ОС Unix, вошедшая, разумеется, и в стандарт POSIX. Идея его проста, но на редкость продуктивна. С помощью конвейеров удается комбинировать возможности, предоставляемые разными командами, получая по существу новое качество. Пример конвейера: ls -al /bin | wc –l Утилита ls не подсчитывает число файлов в каталоге, а лишь выдает информацию о них. С другой стороны, служебная программа wc способна подсчитать число строк в файле, но не имеет отношения к распечатке содержимого каталогов. Если же построить конвейер из двух упомянутых команд, количество файлов в каталоге легко вычисляется. Пример трехступенчатого конвейера: ls -al | grep "Oct " | wc –l Конвейер для поэкранного просмотра результатов: ls -Rl /dev | more Четырехступенчатый конвейер: ls -al | grep "Oct" | tee /tmp/tmpinf | wc -l

Открытые системы 35 Переменные и аргументы shell- процедур Переменные обозначаются именами. Значения могут присваиваться им привычным способом, то есть посредством команд вида: имя=значение [имя=значение]... Все значения в языке shell трактуются как текстовые. Переход от имени переменной к значению помечается посредством явной операции $. Если в команде встречается конструкция: $имя то вместо нее интерпретатор shell подставляет значение переменной с указанным именем. Допускается и запись: ${имя} с тем же смыслом, если нужно отделить имя от последующего текста. Значения формальных аргументов shell-процедур обозначаются как $цифра $0 - это имя интерпретируемой shell-процедуры. Если заданных при вызове команды фактических аргументов меньше, чем 9, "лишние" формальные аргументы получают пустые значения.

Открытые системы 36 Примеры сопоставления с образцом Шаблон * сопоставляется с произвольной цепочкой символов, в том числе с пустой. После присваивания переменной HOME=/home/galat команда echo ${#HOME} выдаст 11. Заменить в имени файла суффикс.f на.for можно с помощью команд: f=file.f mv $f ${f%.f}.for Выдать первый элемент маршрутного имени файла можно с помощью команд: f=маршрутное_имя echo ${f%/*} Последний элемент выдается командой: echo ${f##*/}

Открытые системы 37 Служебные переменные языка shell Значения некоторых переменных устанавливаются самим языком shell. Перечислим эти переменные и опишем их предназначение. # Количество фактических аргументов (десятичное). - Флаги (однобуквенные опции), указанные при запуске shell или установленные посредством команды set (см. далее). ? Десятичное значение, возвращенное предыдущей синхронно выполненной командой. $ Идентификатор процесса, в рамках которого выполняется shell. ! Идентификатор последнего асинхронно запущенного процесса. Совокупность всех фактических аргументов (начиная с $1), разделенных пробелами. Чтобы получить значения этих переменных, перед ними нужно поставить знак $.

Открытые системы 38 Окружение процессов Окружение - это набор пар (имя, значение), который передается выполняемой программе так же, как и обычный список аргументов. Иными словами, порождаемые процессы наследуют окружение процесса-предка. Компонентами окружения являются, помимо прочих, следующие переменные и их значения: HOME Подразумеваемый аргумент утилиты смены текущего каталога cd - домашний каталог пользователя. IFS Цепочка символов, где перечислены разделители полей; обычно включает пробел, табуляцию и перевод строки. PATH Список имен каталогов для поиска команд. В дальнейшем подобные списки называются списками поиска. Элементы списка разделяются двоеточием. Пустой элемент означает текущий каталог. PS1 Основное приглашение интерактивного языка shell (по умолчанию "$"). TERM Тип пользовательского терминала. TZ Информация о часовом поясе. Для отсылки информации об окружении на стандартный вывод следует воспользоваться командой env

Открытые системы 39 Подстановка результатов выполнения команд Если в командной строке встретилась цепочка символов, заключенная в обратные кавычки (`), она интерпретируется как команда, стандартный вывод которой подставляется вместо упомянутой конструкции. Говорят, что в этом случае производится подстановка результатов выполнения команды, а сами обратные кавычки называют символами подстановки. Эквивалентной синтаксической формой для подстановки результата выполнения команды является конструкция вида: $(команда) Для выполнения заданной команды порождается процесс, в рамках которого работает еще один экземпляр командного интерпретатора.

Открытые системы 40 Способы использования подстановки результатов Пусть файл filelist содержит список имен других файлов и над совокупностью последних требуется проделать некоторое действие. Если в командную строку поместить конструкцию... `cat filelist`... то это аналогично явному указанию в командной строке на все файлы из списка. (Утилита cat выдает на стандартный вывод содержимое файлов, заданных в качестве аргументов.) Пример подстановки результатов выполнения команды (выдача информации о файлах): ls -l `cat filelist` Подстановка результатов выполнения команд может сочетаться с другими видами подстановок, например, значения вместо имени переменной. Так, после обработки конструкции ${x:-$(ls)} команда ls выполнится только тогда, когда значение x не установлено или пусто; в противном случае выполнится команда $x, и ее результат займет место в командной строке. В языке shell все значения считаются текстовыми. Значит, для выполнения операций с числами нужны особые средства. Вместо конструкции вида $((выражение)) shell подставит результат вычисления этого выражения, что (с некоторой натяжкой) можно рассматривать как частный случай подстановки результатов выполнения команд. Например, после обработки строки i=$(($i+1)) значение i (если оно было числом) увеличится на единицу.

Открытые системы 41 Управляющие конструкции Среди прочих язык shell содержит следующие управляющие конструкции. Оператор цикла for: for имя [in слово...] do список done Условный оператор: if список_1 then список_2 [elif список_3 …then список_4]... [else список_5] fi Оператор цикла while (until): while список_1 do список_2 done Оператор выбора: case слово in [шаблон [| шаблон]...) список ;;]...esac Определение функции: имя () открывающая_скобка список закрывающая_скобка

Открытые системы 42 Команда test В управляющих конструкциях if и while часто используется команда test, она проверяет некоторое условие и вырабатывает нулевой или ненулевой код завершения в зависимости от того, оказалось ли условие, соответственно, истинным или ложным. Команда записывается любым из двух способов: test условие или употребив пару квадратных скобок: [ условие ] Условие может включать, помимо прочих, следующие примитивы: -r файл Истина, если файл существует и доступен для чтения. -w файл Истина, если файл существует и доступен для записи. -x файл Истина, если файл существует и является выполнимым. -f файл Истина, если файл существует и является обычным файлом. -d файл Истина, если файл существует и является каталогом. -c файл Истина, если файл существует и является специальным символьным файлом. -b файл Истина, если файл существует и является специальным блочным файлом. -p файл Истина, если файл существует и является именованным каналом. -s файл Истина, если файл существует и имеет ненулевой размер. -n s1 Истина, если цепочка символов s1 имеет ненулевую длину. s1 = s2 Истина, если цепочки символов s1 и s2 равны. s1 != s2 Истина, если цепочки символов s1 и s2 не равны. n1 -eq n2 Истина, если целые числа n1 и n2 алгебраически равны. На месте -eq могут быть также операции сравнения -ne (не равно), -gt (больше), -ge (больше или равно), -lt (меньше), -le (меньше или равно). Примитивы комбинируются с помощью круглых скобок, а также следующих операций (в порядке уменьшения приоритета): !Унарная операция отрицания -aЛогическое И -oЛогическое ИЛИ. Обратим внимание на то, что квадратные скобки, обрамляющие условие, и каждый компонент условия должны быть выделены пробелами.

Открытые системы 43 Генерация маршрутных имен файлов После всех подстановок, прежде чем команда начнет выполняться, в каждом составляющем ее поле осуществляется поиск символов *, ?, и [. Если находится хотя бы один из них, то это поле рассматривается как шаблон имен файлов и заменяется именами файлов, удовлетворяющими данному шаблону. Имена подставляются в алфавитном порядке. Если ни одно имя файла не удовлетворяет шаблону, поле остается неизменным. Символ. в начале имени файла или непосредственно после /, так же как и сам символ /, должны быть заданы в шаблоне явно. Трактовка символов *, ? и [: * - сопоставляется с произвольной цепочкой символов, в том числе с пустой. ? - сопоставляется с произвольным символом. [...] - сопоставляется с любым из перечисленных в скобках символов. Пара символов, разделенных знаком -, обозначает отрезок алфавита, включающий сами указанные символы. Если сразу вслед за [ идет !, шаблону удовлетворяет любой символ, не перечисленный в скобках.

Открытые системы 44 Перенаправление ввода/вывода Командный интерпретатор shell ассоциирует с каждым открытым файлом так называемый дескриптор. Дескрипторы нумеруются десятичными целыми числами, начиная с нуля. Верхняя граница зависит от реализации, но, согласно стандарту POSIX, должны поддерживаться по крайней мере десять одновременно открытых файлов (с номерами дескрипторов от 0 до 9 включительно). Дескрипторы с номерами 0, 1 и 2 имеют специальный смысл. Они соответствуют стандартному вводу, стандартному выводу и стандартному протоколу. Перед выполнением команды ее ввод и вывод могут быть перенаправлены, для чего используется специальная нотация, которую интерпретирует shell. Перенаправление ввода: слово >|слово Использовать файл слово для стандартного вывода (дескриптор файла 1). Перенаправление вывода с дозаписью: >>слово Использовать файл слово для стандартного вывода. Если любой из этих конструкций предшествует цифра, она определяет дескриптор (вместо подразумеваемых дескрипторов 0 или 1), который будет ассоциирован с файлом, указанным в конструкции. Например, строка... 2>protocol перенаправляет стандартный протокол (дескриптор 2) в файл по имени protocol. Ввод и вывод могут перенаправляться не только в файл с заданным именем, но и в открытый файл с заданным дескриптором. Для этого в описанных выше конструкциях в качестве слова следует употребить связку &номер_дескриптора: &номер_дескриптора Например, чтобы перенаправить стандартный протокол туда же, куда назначен стандартный вывод, употребить конструкцию... 2>&1 Если в качестве номера_дескриптора указан минус ('-'), соответствующий файл (стандартный ввод, вывод или явно заданный своим дескриптором файл) закрывается. Shell позволяет открыть файл одновременно на чтение и запись при помощи конструкции слово Ей, как всегда, может предшествовать номер дескриптора для открываемого файла. По умолчанию используется 0, то есть стандартный ввод.

Открытые системы 45 Экранирование Под экранированием имеется в виду защита символов от интерпретации со стороны языка shell. Следующие символы shell трактует по- особому; не будучи экранированными, они завершают предшествующее им слово: | & ; ( ) $ ` \ " пробел перевод_строки Не являясь разделителями слов, особую роль играют для shell и символы ? [ ] # ~ = % Каждый из перечисленных выше символов может быть экранирован, т. е. представлять самого себя, если перед ним стоит \ либо он расположен между одиночными или двойными кавычками ('' или ""). Экранирование с помощью двойных кавычек имеет некоторые особенности. Во-первых, оно не отменяет особой трактовки символов $ и `. Иными словами, внутри двойных кавычек обычным образом выполняется подстановка значений переменных, результатов выполнения команд и результатов вычисления арифметических выражений, только результат подстановки расценивается как одно слово. Во-вторых, особая трактовка символа \ отменяется внутри двойных кавычек лишь частично: символ \ сохраняет экранирующую роль, если после него следуют: $ ` " \ перевод_строки

Открытые системы 46 Встроенные команды Очевидным примером встроенной команды служит export - пометить переменную как глобальную, входящую в окружение процесса проще внутренними методами. Встроенные команды подразделяются на обычные и специальные. С точки зрения приложений первые ничем (кроме, быть может, эффективности обработки) не отличаются от невстроенных утилит. В частности, они могут фигурировать в качестве программы процесса. Специальные встроенные команды этим свойством обладать не обязаны. Кроме того, у них есть еще два отличия: синтаксическая ошибка в специальной встроенной команде способна привести к аварийному завершению shell; присваивание переменным, заданное посредством специальной встроенной команды, остается в силе и после ее завершения.

Открытые системы 47 Специальные встроенные команды. файл Специальная команда. позволяет выполнить любую команду в рамках текущего процесса. eval [аргумент...] Выполнить команду, заданную аргументами eval. exec [аргумент...] Сменить программу процесса: в рамках текущего процесса команда, заданная аргументами exec, заменяет shell. exit [код_завершения] Завершить выполнение shell с указанным кодом. shift [n] Формальные аргументы, начиная с (n+1)-го, переименовываются в $1 и т.д. По умолчанию n=1.

Открытые системы 48 Обычные встроенные команды К числу обычных встроенных команд относятся: cd [каталог] Сделать текущим заданный каталог. pwd Выводит имя текущего каталога. read [переменная...] Со стандартного ввода читается одна строка и делится на поля; первое поле присваивается первой переменной, второе - второй и т.д., причем последовательность всех оставшихся полей присваивается последней переменной. Исходная строка имеет продолжение, если в конце ее стоит последовательность \перевод_строки. Символы, отличные от перевода строки, также могут быть экранированы с помощью \, который удаляется перед присваиванием полей. Возвращается нулевой код завершения, если только не встретился конец файла.

Открытые системы 49 Вызов командного интерпретатора shell Вызов командного интерпретатора shell осуществляется командой sh [опция...] [командный_файл [аргумент...]] или sh -c [опция...] командная_цепочка [имя_команды [аргумент...]] или sh -s [опция...] [аргумент...] В первом случае интерпретируется заданный командный файл (или содержимое стандартного ввода, если файл не указан), во втором - цепочка символов, в третьем команды читаются со стандартного ввода. Большинство опций команд sh и set (см. выше) совпадают. Им может предшествовать не только знак минус, но и плюс, что означает инвертирование их смысла. Из специфических опций команды sh выделим -i, предписывающую считать shell интерактивным. Shell будет интерактивным и тогда, когда команды читаются со стандартного ввода, направленного, как и стандартный протокол, на терминал.

Открытые системы 50 Правила формирования и средства разбора командных строк К теме командного языка и его интерпретатора логически примыкают правила формирования и средства разбора командных строк. В общем случае командная строка состоит из имени служебной программы (утилиты), опций, аргументов этих опций и, наконец, операндов команды. Разработчики служебных программ должны руководствоваться следующими правилами. 1.Имя утилиты состоит не менее чем из двух и не более чем из девяти малых латинских букв и/или цифр. 2.Имя опции - это один буквенно-цифровой символ. Опциям предшествует знак минус. После одного минуса могут располагаться несколько опций без аргументов. 3.Опции отделены от своих аргументов. 4.У опций нет необязательных аргументов. 5.Если у опции несколько аргументов, они представляются одним словом и отделяются друг от друга запятыми или экранированными пробелами. 6.Все опции располагаются в командной строке перед операндами. 7.Специальный элемент командной строки --, который не является ни опцией, ни операндом, обозначает конец опций. Все последующие слова трактуются как операнды, даже если они начинаются со знака минус. 8.Порядок разных опций в командной строке не имеет значения. Если повторяется одна опция с аргументами, последние должны интерпретироваться в порядке, указанном в командной строке. 9.Порядок интерпретации операндов может зависеть от утилиты. 10.Если операнд задает читаемый или записываемый файл, то знак минус на его месте используется только для обозначения стандартного ввода (или стандартного вывода, если из контекста ясно, что специфицируется выходной файл).

Открытые системы 51 Данные, ассоциированные с пользователем Операционная система, соответствующая стандарту POSIX, должна поддерживать базу данных пользователей, в которой о каждом из них хранится по крайней мере следующая информация: –имя пользователя; –числовой идентификатор пользователя; –числовой идентификатор начальной группы; –начальный рабочий каталог; –начальная программа пользователя. Пользователи объединяются в группы; каждый пользователь является членом хотя бы одной из них. Для групп также существует база данных, ее записи содержат по крайней мере следующие поля: –имя группы; –числовой идентификатор группы; –список пользователей, которым разрешено становиться членами данной группы.

Открытые системы 52 Служебные программы, обслуживающие взаимодействие пользователей Активными мы будем называть пользователей, работающих в системе в некоторый момент времени. Чтобы узнать, какие пользователи активны и за какими терминалами они работают, можно воспользоваться служебной программой who К той же дополнительной категории, что и who, принадлежат утилиты write, talk и mesg (а также описанная выше служебная программа newgrp). После установления соединения утилита write имя_пользователя [терминал] позволяет построчно пересылать стандартный ввод отправителя на терминал пользователя- получателя. Аргументы имя_пользователя и терминал задаются в том виде, как их выводит служебная программа who. Необязательный аргумент [терминал] нужен в тех случаях, когда пользователь-получатель вошел в систему с нескольких терминалов. Утилиту talk имя_пользователя [терминал] можно рассматривать как более современный аналог write, поскольку она имеет экранный интерфейс и поддерживает двустороннее взаимодействие активных пользователей. С помощью служебной программы mesg [y|n] пользователь может разрешить или запретить установление соединений со своим терминалом. При вызове без аргументов mesg выдает текущий статус терминала.

Открытые системы 53 Файлы. Основные понятия. В трактовке стандарта POSIX понятие файла охватывает все, что может содержать, потреблять и/или поставлять информацию. В объектно-ориентированной терминологии файл должен предоставлять методы для чтения и/или записи и иметь такие атрибуты, как тип, имя и режим. В стандарте зафиксированы следующие типы файлов: –обычный файл; –каталог; –канал; –символьный специальный файл; –блочный специальный файл; –символьная ссылка; –сокет. Обычный файл представляет собой последовательность байт с возможностью случайного доступа и без какой-либо дополнительной структуры, наложенной операционной системой. Каталог состоит из элементов (ссылок), ассоциирующих имена с файлами. Канал можно представлять себе в виде транспортера, с одной стороны которого находится поставщик (процесс, пишущий в канал), а с другой - потребитель (процесс, читающий из канала). Специальные файлы соответствуют аппаратным компонентам компьютера. Символьная ссылка - это файл, хранящий цепочку символов. Сокет - это оконечная точка межпроцессных коммуникаций.

Открытые системы 54 Файловая система Файлы вместе со служебной информацией, хранящейся в объектах, которые называются описателями файлов, объединяются в иерархическую структуру (направленный граф), именуемую файловой системой. Все неконцевые вершины графа (т. е. вершины, откуда выходит хотя бы одна дуга) являются каталогами; все концевые имеют другие типы. В пределах файловой системы каждый файл имеет уникальный идентификатор (порядковый номер - он же номер описателя файла). Имена, ассоциируемые с файлами (точнее, с их порядковыми номерами) посредством каталогов, называются простыми. С формальной точки зрения они могут включать любые символы, кроме слэша (/), однако для повышения мобильности приложений стандарт рекомендует ограничиться латинскими буквами, цифрами, а также символами., _, - (точка, подчеркивание, минус), причем минус не должен быть первым символом. В соответствующей стандарту операционной системе сохраняется различие между большими и малыми буквами. Под маршрутным именем понимается цепочка символов, идентифицирующая файл и состоящая из нескольких (в том числе из нуля) простых имен файлов, разделенных символами / и называемых компонентами маршрута. Маршрутные имена, начинающиеся символом /, называются абсолютными, они задают маршрут от корня файловой системы. Прочие имена называются относительными, маршрут в них задан относительно текущего каталога. Маршрутным префиксом называется маршрутное имя, ссылающееся на каталог. Если маршрутное имя оканчивается символом /, оно обязано быть маршрутным префиксом. Маршрутные имена называют также составными именами файлов.

Открытые системы 55 Биты режима Биты режима подразделяются на: –биты режима доступа, –бит переустановки идентификатора пользователя (этот и следующий биты будут описаны при рассмотрении процессов), –бит переустановки идентификатора группы, –бит ограничения на удаление элементов каталогов (последняя возможность относится к числу необязательных). Биты режима доступа, вместе с другими атрибутами, определяют, имеет ли процесс, действующий от имени некоторого пользователя, право на соответствующие операции с файлом. По отношению к конкретному файлу все пользователи делятся на три категории: –владелец файла; –члены владеющей группы; –прочие пользователи. Для каждой из них режим доступа определяет права на операции с файлом, а именно: –право на чтение; –право на запись; –право на выполнение (для каталогов - право на поиск).

Открытые системы 56 Получение информации о файлах и файловых системах Чтобы узнать абсолютное маршрутное имя текущего каталога, приложение может воспользоваться упоминавшейся ранее обычной встроенной командой языка shell pwd [-L | -P] #include char *getcwd (char *buf, size_t size); Команда pwd с (подразумеваемой) опцией -L извлекает имя текущего каталога из переменной окружения PWD, если это возможно. Посредством опции -P выполняется раскрытие символьных ссылок: в выдаваемом на стандартный вывод абсолютном маршрутном имени вместо символьных ссылок подставляется их содержимое. Функция getcwd() помещает абсолютное маршрутное имя текущего каталога (без символьных ссылок) в массив buf длины size, который и возвращается в качестве результата (при ошибке результат равен NULL). Для выдачи на стандартный вывод информации о файлах всех типов служит утилита ls [опция...] [файл...] Опции управляют порядком и степенью подробности выдаваемой информации о файлах. Если опции не заданы, выводятся только имена файлов. Если не заданы файлы, выдается информация о файлах текущего каталога. Опция -l предписывает выводить подробную информацию.

Открытые системы 57 Пример использования служебной программы ls При использовании служебной программы ls по команде ls -l / может быть выдано следующее total 338 drwxrwxr-x 2 root root 4096 Jul 6 13:31 a drwxr-xr-x 2 root root 4096 Jul 8 13:32 bin drwxr-xr-x 4 root root 1024 Jul 6 15:06 boot drwxrwxr-x 2 root root 4096 Jul 6 13:31 cdrom drwxr-xr-x 18 root root Sep 2 10:42 dev drwxr-xr-x 6 root root 4096 Feb dss drwxr-xr-x 60 root root 4096 Sep 2 10:42 etc drwxr-xr-x 20 root root 4096 Jul 15 18:00 home drwxr-xr-x 2 root root 4096 Jun initrd drwxr-xr-x 8 root root 4096 Aug 8 13:16 lib drwx root root Jul 6 14:15 lost+found drwxr-xr-x 2 root root 4096 Apr misc drwxr-xr-x 5 root root 4096 Jul 6 11:24 mnt drwxr-xr-x 7 root root 4096 Jul 23 13:09 opt dr-xr-xr-x 84 root root 0 Sep proc drwxr-x--- 5 root root 4096 Sep 1 17:10 root drwxr-xr-x 2 root root 4096 Jul 11 17:38 sbin drwxrwxrwt 23 root root 8192 Sep 2 12:43 tmp drwxr-xr-x 14 root root 4096 Jul 15 12:50 usr drwxr-xr-x 16 root root 4096 Jul 9 16:22 var Число в первой строке есть суммарный размер (в блоках по 512 байт) всех файлов каталога, информация о которых выдана. Далее следуют строки с информацией об отдельных файлах. Первый символ в этих строках задает тип файла: d - каталог; b - блочный специальный файл; c - символьный специальный файл; l - символьная ссылка; p - канал; - (минус) - обычный файл.

Открытые системы 58 Опции служебной программы ls КлючОписание -aВывести список всех файлов (обычно не выводятся данные о файлах, имена которых начинаются с точки). -CВыдавать имена файлов в несколько столбцов (с сортировкой по столбцам). Отметим, что если в командной строке встречаются пары взаимоисключающих опций (например, -lC), то действует та, что указана последней. -dТрактовать каталоги наравне с файлами других типов. Часто используется с опцией -l для получения сведений о состоянии каталога. -FВыводить символ / после имен каталогов, * - после выполнимых файлов, | - после - после символьных ссылок. -iВыдавать порядковый номер файла в файловой системе (см. выше). -RРекурсивно обойти встретившиеся подкаталоги. -rИзменить порядок сортировки файлов на обратный. -tИспользовать в качестве первичного ключа сортировки время последнего изменения (сначала идут самые свежие файлы); имя служит вторичным ключом. Обычно символьные ссылки трактуются утилитой ls наравне с файлами других типов, только на месте имени выводится комбинацияимя_файла-ссылки -> содержимое_файла-ссылки. Для получения информации о файле, на который указывает символьная ссылка, следует воспользоваться одной из следующих опций. -LЕсли символьная ссылка является аргументом утилиты ls или встретилась в процессе обхода файловой иерархии, выдавать информацию об указуемом файле, а не о ссылке. На месте имени выводится имя файла-ссылки (а не указуемого файла). -HАналогична -L, но воздействует только на символьные ссылки, заданные в командной строке и указывающие на каталог.

Открытые системы 59 Изменение атрибутов файлов и текущей позиции в файловой иерархии Для смены текущего каталога (т. е. начальной точки маршрутов, не начинающихся символом /) служат упоминавшаяся ранее обычная встроенная команда языка shell cd [-L | -P] [целевой_каталог] cd - и функция chdir(): #include int chdir (const char *path); Команда cd без аргументов осуществляет переход в домашний каталог пользователя, заданный переменной окружения HOME. Если аргументом является минус, осуществляется переход в каталог, ранее бывший текущим, и в случае успеха выводится его абсолютное маршрутное имя. cd "$OLDPWD" && pwd

Открытые системы 60 Создание файлов При программировании на языке C для создания обычных файлов можно воспользоваться функцией creat(): #include int creat (const char *path, mode_t mode); Функция creat() имеет два аргумента: маршрутное имя вновь образуемого файла и устанавливаемый режим доступа (идентификаторы владельца и владеющей группы наследуются у текущего пользователя). Результатом служит файловый дескриптор (который, напомним, представляется неотрицательным целым числом), т. е. функция creat() не только создает файл, но и открывает его. Для создания (пустых) каталогов служит утилита: mkdir [-p] [-m режим_доступа] каталог... и функция mkdir() #include int mkdir (const char *path, mode_t mode); С помощью одной команды mkdir можно сформировать несколько каталогов. В каждом из них появятся ссылки. и.., которые другими способами создать нельзя. По умолчанию устанавливаются все биты режима доступа; режим можно задать и явно с помощью опции -m. Если нужен не один, а целая цепочка каталогов, следует воспользоваться опцией -p. mkdir -p work/tmp/save

Открытые системы 61 Удаление файлов Для удаления файлов служит утилита: rm [-fiRr] файл... Опция -i означает удаление файлов с предварительным запросом подтверждения. Опция -f предписывает не запрашивать подтверждений и не выдавать диагностических сообщений, если удаляемый файл не существует. Опция полезна, когда нет уверенности в существовании удаляемого файла и его отсутствие не является ошибкой. Для удаления файла желательно иметь право на запись в него (обязательным является наличие права на запись в каталог, содержащий удаляемую ссылку). Если такого права нет, то утилита rm запрашивает подтверждение. В общем случае подтверждение на удаление запрашивается при выполнении следующего условия: –(не задана опция -f) И –(((отсутствует право на запись в файл) И –(стандартный ввод назначен на терминал)) ИЛИ –(задана опция -i))) Наконец, две эквивалентные "сверхмощные" опции -R и -r (первая предусмотрена стандартом POSIX, вторая поддерживается по историческим причинам) позволяют удалять каталоги со всем их содержимым (если, конечно, хватает прав). Для удаления каталогов (правда, только пустых) используется утилита rmdir [-p] файл... #include int rmdir (const char *path); Опция -p предписывает удалять всю цепочку каталогов, составляющих заданное маршрутное имя. Функция unlink() предназначена для удаления файлов, не являющихся каталогами : #include int unlink (const char *path); Функция remove() объединяет возможности функций rmdir() и unlink(). #include int remove (const char *path);

Открытые системы 62 Копирование файлов Копирование файлов, выполняется служебной программой cp: cp [-fip] исходный_файл целевой_файл cp [-fip] исходный_файл... целевой_каталог cp -R [-H | -L | -P] [-fip] исходный_файл... целевой_каталог В двух первых формах утилита cp напоминает ln, только наряду с возможным созданием новых ссылок создаются и новые файлы и, в любом случае, копируется содержимое исходных (или указуемых исходными, если последние представляют собой символьные ссылки) файлов. При наличии опции -R выполняется рекурсивное копирование исходных файловых иерархий в целевой каталог со стандартной трактовкой символьных ссылок, управляемой опциями -H, -L и -P (см. выше, например, описание утилиты chown). Если копирование производится в существующий каталог, имена копий образуются как конкатенация целевого каталога, символа / и маршрута относительно каталога, содержащего исходный_файл. Если в командной строке заданы два файла и целевой не существует, он создается и становится корнем иерархии-копии, то есть исходный_файл копируется непосредственно в него, а маршруты файлов нижележащих уровней считаются относительно исходного_файла. Если в командной строке задано более двух файлов и целевой не существует или не является каталогом, это считается ошибкой. Опция -i влечет запрос подтверждения перед попыткой копирования в существующий файл. По опции -f, если не удается открыть целевой файл, делается попытка сначала удалить его, а затем продолжить действия по копированию. Опция -P вызывает копирование не только содержимого, но и атрибутов исходных файлов (режима, идентификаторов владельца и владеющей группы, времени последнего доступа и изменения)

Открытые системы 63 Перемещение файлов Служебная программа перемещения файлов mv: mv [-fi] исходный_файл целевой_файл mv [-fi] исходный_файл... существующий_целевой каталог Формально можно считать, что она выполняет копирование иерархий с корнями в исходных_файлах (без раскрытия символьных ссылок и с копированием атрибутов файлов) и уничтожает оригиналы. Отметим, что в первой форме mv целевой_файл может не существовать, а исходный - являться каталогом; в любом случае на месте целевого каталога допускается использование символьной ссылки на него. На самом деле утилита mv, как правило, применяется для переименования файлов, и тогда ее работа сводится к созданию новых элементов каталогов и уничтожению старых, а реальное копирование может потребоваться только при перемещении файлов между файловыми системами (например, со съемного носителя на постоянный). По опции -i запрашивается подтверждение перед замещением существующего файла, опция -f влечет отсутствие подобных запросов (по поводу логики запроса подтверждений см. выше описание команды rm).

Открытые системы 64 Обход и обработка файловых иерархий Для обхода файловой иерархии и систематической обработки ее элементов служит утилита find: find [-H | -L] файл... [выражение] Она рекурсивно обходит каждую из иерархий с корнями в заданных файлах (разумеется, обычно в этом качестве указываются каталоги), отыскивая файлы, которые удовлетворяют логическому выражению, построенному с помощью описанных ниже средств. Опции -H и -L стандартным образом влияют на трактовку символьных ссылок. Если указуемый файл не существует, find оперирует с самой ссылкой. Элементарные логические выражения могут комбинироваться с помощью следующих операций (в порядке уменьшения приоритета): унарная операция отрицания, обозначается !. логическое И, обозначается пробелом или -a. Если значением первого операнда оказалась ложь, второй не вычисляется. Таким образом, последовательность разделенных пробелами выражений-операндов можно рассматривать как составной фильтр, через который пропускается текущий файл: если значением очередного операнда оказалась ложь, обработка прекращается; в противном случае файл передается следующему компоненту фильтра. логическое ИЛИ, обозначается -o. Если значением первого операнда оказалась истина, второй не вычисляется.

Открытые системы 65 Ввод/Вывод. Основные понятия В стандарте POSIX-2001 предусмотрены две основные группы функций, обслуживающие операции ввода/вывода: функции нижнего уровня, использующие упоминавшиеся ранее целочисленные файловые дескрипторы (эти функции и ассоциирован- ные объекты определены в заголовочном файле ); функции более высокого уровня, осуществляющие буферизованный ввод/вывод с применением потоков (см. ).

Открытые системы 66 Открытие и закрытие файлов Для открытия файлов и формирования новых описаний открытых файлов, файловых дескрипторов и потоков служат функции нижнего уровня open() и pipe() #include int open (const char *path, int oflag,...); #include int pipe (int fildes [2]); Функция open() открывает файл с заданным маршрутным именем (первый аргумент, path), создавая для него описание – новое и, следовательно, не разделяемое с другими процессами. Возвращаемый в качестве результата файловый дескриптор является минимальным из числа не используемых в данный момент текущим процессом (при неудаче возвращается -1). Второй аргумент, oflag, устанавливает флаги статуса файла и определяет допустимые виды операций ввода/вывода. При успешном завершении pipe() возвращает 0, при неудаче – - 1.

Открытые системы 67 Чтение и запись данных Чтение данных из файла выполняют функции read() и fread() #include ssize_t read (int fd, void *buf, size_t nbyte); #include size_t fread (void *restrict buf, size_t size, size_t nitems, FILE *restrict stream); Функция read() пытается прочитать nbyte байт из файла, ассоциированного с дескриптором fd, и поместить их в буфер buf. Для файлов, допускающих позиционирование, read() выполняет чтение, начиная со значения индикатора текущей позиции, ассоциированного с дескриптором fd. После завершения операции этот индикатор увеличивается на количество прочитанных байт. Для устройств, не поддерживающих позиционирования (таких, например, как терминал), значение упомянутого индикатора не определено, а чтение выполняется с текущей позиции устройства. При успешном завершении read() возвращает количество байт, реально прочитанных и помещенных в буфер; это значение может оказаться меньше значения аргумента nbyte, если до конца файла оставалось меньше, чем nbyte байт.

Открытые системы 68 Управляющие операции с файлами и ассоциированными данными К числу управляющих операций с файлами относится прежде всего позиционирование. Индикатор текущей позиции может быть опрошен или передвинут при помощи функции нижнего уровня lseek(), а также функций буферизованного ввода/вывода fseek(), ftell(), ftello(), fgetpos(), fsetpos(), rewind() #include off_t lseek (int fildes, off_t offset, int whence); #include int fseek (FILE *stream, long offset, int whence); long ftell (FILE *stream); off_t ftello (FILE *stream); int fgetpos (FILE *restrict stream, fpos_t *restrict pos); int fsetpos (FILE *stream, const fpos_t *pos); void rewind (FILE *stream); Функция lseek() устанавливает индикатор текущей позиции следующим образом. Сначала, в зависимости от значения третьего аргумента, whence, выбирается точка отсчета: 0, если это значение равно SEEK_SET, текущая позиция для SEEK_CUR и размер файла для SEEK_END. Затем к точке отсчета прибавляется смещение offset (второй аргумент). Результатом функции lseek() служит новое значение индикатора текущей позиции, отсчитанное в байтах от начала файла. В случае ошибки возвращается (off_t) (-1), а текущая позиция остается прежней.

Открытые системы 69 Процессы. Основные понятия Процесс – это адресное пространство вместе с выполняемыми в нем потоками управления, а также системными ресурсами, которые этим потокам требуются. Каждый процесс обладает целым рядом атрибутов. Важнейшим среди них является идентификатор процесса – положительное целое число, однозначно идентифицирующее процесс в течение времени его жизни. Процессы могут создаваться и завершаться. Время жизни процесса – это период от его создания до возврата идентификатора операционной системе. Зомби-процесс – завершившийся процесс, подлежащий ликвидации после того, как код его завершения будет передан ожидающему этого другому процессу. Процесс, создавший данный, называется родительским, в течение времени жизни которого существует идентификатор родительского процесса. По завершении времени жизни указанного процесса родительским становится определяемый реализацией системный процесс. Группа – совокупность процессов, допускающая согласованную доставку сигналов. У каждой группы имеется уникальный положительный целочисленный идентификатор, представляющий ее в течение времени ее жизни. В такой роли выступает идентификатор процесса, именуемого лидером группы. Временем жизни группы процессов называют период от создания группы до момента, когда ее покидает последний процесс (по причине завершения или смены группы). Задание – это набор процессов, составляющих конвейер, а также порожденных ими процессов, входящих в одну группу. Под управлением заданиями подразумеваются предоставленные пользователям средства выборочно (при)останавливать и затем продолжать (возобновлять) выполнение процессов. На отдельные задания ссылаются с помощью идентификаторов. Сеансом называется множество групп процессов, сформированное для целей управления заданиями. Каждая группа принадлежит некоторому сеансу; считается, что все процессы группы принадлежит тому же сеансу. Вновь созданный процесс присоединяется к сеансу своего создателя; в дальнейшем принадлежность сеансу может быть изменена. Время жизни сеанса представляет собой период от создания сеанса до истечения времени жизни всех групп процессов, принадлежавших сеансу. Лидер сеанса – процесс, создавший данный сеанс. Управляющим терминалом называется терминал, ассоциированный с сеансом. У сеанса может быть не более одного управляющего терминала, а тот, в свою очередь, ассоциируется ровно с одним сеансом. Некоторые последовательности символов, вводимые с управляющего терминала, вызывают посылку сигналов всем процессам группы, ассоциированной с данным управляющим терминалом. Управляющий процесс – это лидер сеанса, установивший соединение с управляющим терминалом. Если в дальнейшем терминал перестанет быть управляющим для сеанса, лидер сеанса утратит статус управляющего процесса.

Открытые системы 70 Процессы. Основные понятия Выполняющимся (активным) называется поток управления, обрабатываемый в данный момент процессором. В многопроцессорных конфигурациях может одновременно выполняться несколько потоков. Поток управления считается готовым к выполнению, если он способен стать активным, но не может этого сделать из-за отсутствия свободного процессора. Поток управления называют вытесненным, когда его выполнение приостановлено из-за того, что другой поток с более высоким приоритетом уже готов к выполнению. Процесс (поток управления) считается блокированным, если для продолжения его выполнения должно стать истинным некоторое условие, отличное от доступности процессора. Список потоков управления – это упорядоченный набор готовых к выполнению равноприоритетных потоков, очередность которых определяется политикой планирования. Множество наборов включает все потоки в системе, готовые к выполнению. Планированием, согласно стандарту POSIX-2001, называется применение политики изменения списков потоков управления, а также политики выбора процесса или готового к выполнению потока управления для перевода как того, так и другого в число активных. Под политикой планирования понимается набор правил, используемых для определения порядка выполнения процессов или потоков управления при достижении некоторой цели. Политика планирования воздействует на порядок процессов (потоков управления) по крайней мере в следующих ситуациях: когда активный процесс (поток управления) блокируется или вытесняется; когда блокированный процесс (поток управления) становится готовым к выполнению. Область планирования размещения – это набор процессоров, по отношению к которым в какой-то момент времени планируется поток управления. Областью планирования конкуренции называется свойство потока управления, определяющее набор потоков, с которыми он конкурирует за ресурсы (например, за процессор).

Открытые системы 71 Опрос и изменение атрибутов процессов Для выдачи информации о процессах служит утилита ps: ps [-aA] [-defl] [-G список_групп] [-o формат]... [-p список_процессов] [-t список_терминалов] [-U список_пользователей] -g список_групп] [-n список_имен] [-u список_пользователей] По умолчанию информация выдается обо всех процессах, имеющих тот же действующий идентификатор и тот же управляющий терминал, что и у текущего пользователя. При этом выводятся идентификатор процесса, имя управляющего терминала, истраченное к данному моменту процессорное время и имя программы (команды), выполняемой в рамках процесса.

Открытые системы 72 Создание и завершение процессов Новые процессы создаются при помощи функции fork() #include pid_t fork (void); Новый (порожденный) процесс является точной копией процесса, вызвавшего fork() (родительского), за исключением следующих моментов. 1.У порожденного процесса свой идентификатор, равно как и идентификатор родительского процесса. 2.У порожденного процесса собственная копия файловых дескрипторов, ссылающихся на те же описания открытых файлов, что и соответствующие дескрипторы родительского процесса. 3.Порожденный процесс не наследует блокировки файлов, установленные родительским процессом. 4.Порожденный процесс создается с одним потоком управления – копией того, что вызвал fork(). 5.Имеются также некоторые тонкости, связанные с обработкой сигналов, на которых мы, однако, останавливаться не будем. В случае успешного завершения функция fork() возвращает порожденному процессу 0, а родительскому процессу – идентификатор порожденного процесса. После этого оба процесса начинают независимо выполнять инструкции, расположенные за обращением к fork(). При неудаче родительскому процессу возвращается -1, новый процесс не создается.