К группе системных программ относятся операционные системы, операционные оболочки, утилиты, драйверы, архиваторы, антивирусные и некоторые другие программы.
- Операционные системы представляют собой пакеты программ, которые обеспечивают эффективную работу всех аппаратных средств компьютера, а также возможность управления всеми его ресурсами (см. раздел 3.5).
- Операционные оболочки представляют собой дополнительные программы, которые предназначены для повышения удобства управления работой операционных систем (см. раздел 3.7.2).
- Утилиты (utility — полезность) представляют собой небольшие, но очень полезные программы, которые выполняют разнообразные вспомогательные функции по управлению работой аппаратных средств, по повышению эффективности их работы, проверки работоспособности, обслуживания и настройки.
- Для выполнения операций по обмену данными между программой и различными внешними устройствами в состав операционной системы включается ряд специализированных программ, которые принято называть драйверами (drive — управлять). Отсутствие или применение не соответствующего устройству драйвера делает бесполезным это устройство.
- Программы-архиваторы служат для создания архивных копий важных программ и наборов данных. Архиваторы также минимизируют объем, который нужен для размещения архива на внешнем носителе.
- Антивирусные программы обеспечивают пользователя необходимыми средствами борьбы с упоминавшимися выше компьютерными вирусами.
Разрабатываются, настраиваются и поддерживаются в рабочем состоянии системные программы специалистами, которых принято называть системными программистами. Они должны обладать высокой квалификацией, в деталях знать аппаратное обеспечение компьютера и способы работы с данными на машинном уровне. Рядовому пользователю приходится постоянно сталкиваться с системными программами, но уже с точки зрения их эксплуатации, использования их возможностей для решения своих задач. С некоторыми программами этой группы мы познакомимся в следующих главах пособия.
Системный вызов в программировании и вычислительной технике — обращение прикладной программы к ядру операционной системы для выполнения какой-либо операции. Современные операционные системы (ОС) предусматривают разделение времени между выполняющимися вычислительными процессами (многозадачность) и разделение полномочий, препятствующее исполняемым программам обращаться к данным других программ и оборудованию. Ядро ОС исполняется в привилегированном режиме работы процессора. Для выполнения межпроцессной операции или операции, требующей доступа к оборудованию, программа обращается к ядру, которое, в зависимости от полномочий вызывающего процесса, исполняет либо отказывает в исполнении такого вызова. С точки зрения программиста системный вызов обычно выглядит как вызов подпрограммы или функции из системной библиотеки. Однако системный вызов как частный случай вызова такой функции или подпрограммы следует отличать от более общего обращения к системной библиотеке, поскольку последнее может и не требовать выполнения привилегированных операций.
Структура— это набор из одной или более переменных, возможно различных типов, сгруппированных под одним именем для удобства обработки. (В некоторых языках, самый известный из которых паскаль, структуры называются "записями").
Традиционным примером структуры является учетная карточка работающего:
"служащий" описывается набором атрибутов таких, как фамилия, имя, отчество (ф.и.о.), адрес, код социального обеспечения, зарплата и т.д. Некоторые из этих атрибутов сами могут оказаться структурами: ф.и.о. Имеет несколько компонент, как и адрес, и даже зарплата. Структуры оказываются полезными при организации сложных данных особенно в больших программах, поскольку во многих ситуациях они позволяют сгруппировать связанные данные таким образом, что с ними можно обращаться, как с одним целым, а не как с отдельными объектами.
Процессы могут обмениваться между собой информацией через файлы. Существуют файлы с необычным поведением - так называемые FIFO-файлы (first in, first out), ведущие себя подобно очереди. У них указатели чтения и записи разделены. Работа с таким файлом напоминает проталкивание шаров через трубу - с одного конца мы вталкиваем данные, с другого конца - вынимаем их. Организация FIFO-файлов идет по принципу «первый пришёл — первый вышел». Операция чтения из пустой "трубы" проиостановит вызов read (и издавший его процесс) до тех пор, пока кто-нибудь не запишет в FIFO-файл какие-нибудь данные. Очередь в программировании используется, как и в реальной жизни, когда нужно совершить какие-то действия в порядке их поступления, выполнив их последовательно. Примером может служить организация событий в Windows. Когда пользователь оказывает какое-то действие на приложение, то в приложении не вызывается соответствующая процедура (ведь в этот момент приложение может совершать другие действия), а ему присылается сообщение, содержащее информацию о совершенном действии, это сообщение ставится в очередь, и только когда будут обработаны сообщения, пришедшие ранее, приложение выполнит необходимое действие.
4.1 С-функции работы с файлами
Изучение и использование С-функций работы с файлами.
Рассмотрим основные системные вызовы, связанные с проведением операций ввода-вывода, которые наиболее часто используются в операционной системе UNIX. Ввод-вывод в ОС UNIX является крайне простой операцией и налагает на пользователя минимум ограничений.
Системный вызов ореn (открыть файл) имеет следующий формат:
#include <sys/file.h>
open(name, flags, mode)
char *name;
int flags, mode;
Системный вызов open открывает файл с именем name для чтения и/или записи. Режим открытия файла определяется значением параметра flags. Это значение может быть задано как результат логического сложения следующих признаков (в любой комбинации):
0_RDONLY - открыть только для чтения.
0_WRONLY -открыть только для записи.
0_RDWR - открыть для чтения и записи.
0_NDELAY - не блокировать при открытии. Если операция открытия задерживается по каким-либо причинам, например, при отсутствии готовности линии связи, процесс не приостанавливается. Возвращается код ошибки.
0_АРРЕND - открыть для дозаписи. Обычно, при открытии файла, указатель текущей позиции чтения/записи устанавливается на его начало, но, если задан режим 0_АРРЕND, этот указатель устанавливается на конец файла.
0_СRЕАТ - создать файл, если он не существует.
0_TRUNC - сократить размер файла. В режиме 0_ТRUNC, если указанный файл существует, его размер усекается до нуля.
0_ЕХСL - выдавать ошибку при попытке создания существующего файла. (Этот признак используется в сочетании с признаком 0_СRЕАТ). Режим может применяться для организации простого механизма блокировки.
В случае успешного завершения вызова Ореn, возвращается дескриптор открытого файла, иначе - значение -1 и в переменную еrrnо записывается код ошибки.
При неудачном завершении, переменная еrrnо может принимать следующие значения:
[ЕNOTDIR] - указанное имя, содержит компоненту, которая не является справочником;
[ЕNOENT] - указанный файл не существует и режим 0_СRЕАТ не был определен;
[ЕРЕКМ] - указанное имя содержит символ, отсутствующий в коде АSCП*);
[ЕLООР] - число косвенных ссылок в указанном имени превышает максимально допустимое значение;
[ЕROFS] - указанный файл содержится в файловой системе закрытой по записи и не может быть модифицирован;
[ЕTXTBSY] - попытка открыть на запись файл, содержащий загрузочный модуль выполняющейся реентерабельной программы;
[ЕАССЕS] - режим доступа указанного файла не соответствует
запросу;
[ЕFAULТ] - адрес параметра системного вызова выходит за границы адресного пространства процесса;
[ЕISDIR] Попытка открыть на запись справочник;
[ЕМFILЕ] - переполнена таблица дескрипторов открытых файлов процесса;
[ЕNXIO] - указанный файл является внешним устройством, которое в данный момент не готово к работе.
Системный вызов сrеаt (создать файл) имеет следующий формат:
сreat(name,mode)
сhar *name;
int mode;
Функция сгеаt создает новый (или подготавливает к повторной записи уже существующий) файл с именем name. Если файл еще не существует, значение параметра mode используется для формирования режимов доступа создаваемого файла, при этом учитывается значение маски режимов процесса. Значение параметра mode составляется по правилам, приведенным в описание системного вызова chmod. Если указанный файл существует, то его владелец и режим доступа остаются прежними, а файл усекается до нулевой длины. Кроме того, файл открывается для записи и возвращается его дескриптор.
При неудачном завершении, операции сгеаt возвращается значение -1, в остальных случаях возвращается дескриптор открытого файла (целое положительное число).