Операционная система
ДЕМОС позволяет передавать аргу-менты команды начинающей выполняться программе. Когда функ-ция
main вызывается системой, она вызывается с двумя аргу-ментами. Первый аргумент (типа
int, условно называемый
argc)указывает число аргументов в командной строке, с которыми
-64- происходит обращение к программе; второй аргумент (
argv)является указателем на массив символьных строк, содержащихэти аргументы, по одному в строке. Самую простую иллюстрацию этой возможности и необходи-мых при этом описаний дает программа
echo, которая простопечатает в одну строку аргументы командной строки, разделяяих пробелами., Если дана команда
echo hello,
world то в результате получим:
hello,
world По соглашению
argv [0] является именем, по которомувызывается программа, так что
argc по меньшей мере равен 1.В приведенном выше примере
argc равен 3, а
argv [0],
argv [1]и
argv [2] равны соответственно
echo,
hello, и
world. Первымфактическим агументом является
argv [1], а последним -
argv [
argc -1]. Если
argc равен 1, то за именем программы неследует никакой командной строки аргументов. Все это пока-зано в
echo:
main (
argc,
argv)
int argc;
char *argv [];
{ int i;
for (
i = 1;
i <
argc;
i ++)
printf ("
%s%c ",
argv [
i ], (
i <
argc -1)
? ' ': '\n'); } Поскольку
argv является указателем на массив указателей, тосуществует несколько способов написания этой программы,использующих работу с указателем, а не с индексацией мас-сива. Следующий пример демонстрирует другой вариант:
main (
argc,
argv)
int argc;
char **argv;
{ while (--
argc > 0)
printf ("
%s%c ",
*++argv, (
argc > 1)
? ' ': '\n');
} Кроме строки аргументов, программа получает от системынабор переменных, описывающих среду, в которой она выполня-ется. Каждая переменная состоит из имени и значения
-65- (текстовой строки). Например, переменная
TERM передает типтерминала, с которого программа запущена. Для запроса значе-ния переменной по имени используется функция
getenv:
char *getenv ();
par =
getenv ("
имя _
переменной ") Функция возвращает указатель на строку - значение перемен-ной, либо
NULL, если имя не найдено в описании среды.
* 15. ИНТЕРФЕЙС СИСТЕМЫ ДЕМОС
Все без исключения возможности операционной системы
ДЕМОС доступны из программ на языке Си. Материал этой главыотносится к интерфейсу между Си-программами и операционнойсистемой
ДЕМОС. Материал делится на следующие части:ввод/вывод, система файлов, процессы, сигналы. Предполага-ется знание основных концепций ОС
ДЕМОС, а также понятий"файл", "процесс", "сигнал". Подробное описание системныхвызовов и соответствующих им функций из стандартной библио-теке имеется в руководстве программиста по
ОС ДЕМОС и в опе-ративной документации (части 2 и 3). Например, если в опи-сании говорится о функции
popen (3), то подробное описаниеследует искать в руководстве программиста, часть 4, или воперативной документации, часть 3; справку о функции можнополучить на терминал, набрав
man 3
popen.
Ввод/вывод
В описании библиотеки ввода/вывода был описан универ-сальный интерфейс, который одинаков для всего многообразияоперационных систем. На каждой конкретной операционной сис-теме функции стандартной библиотеки должны быть написаны втерминах ввода-вывода, доступных на данной машине. В следую-щих разделах описан набор функций ввода/вывода нижнегоуровня, поддерживаемых ядром операционной системы
ДЕМОС.
Дескрипторы файлов
В операционной системе
ДЕМОС весь ввод и вывод осу-ществляется посредством чтения файлов или их записи, потомучто все периферийные устройства, включая терминал пользова-теля, являются файлами определенной файловой системы. Этоозначает, что один однородный интерфейс управляет всеми свя-зями между программой и периферийными устройствами. В наиболее общем случае перед чтением из файла илизаписью в файл необходимо сообщить системе о намерении сде-лать это; этот процесс называется "открытием" файла. Системавыясняет, имеет ли программа право поступать таким образом(существует ли этот файл? имеется ли разрешение на обраще-ние к нему?), и если все в порядке, возвращает в программунебольшое положительное целое число, называемое дескриптором
-66- файла. Всякий раз, когда этот файл используется для вводаили вывода, для идентификации файла употребляется дескрипторфайла, а не его имя (здесь существует примерная аналогия сиспользованием
read (5,...) и
write (6,...) в Фортране). Всяинформация об открытом файле содержится в системе; программапользователя обращается к файлу только через дескрипторфайла. Для удобства выполнения обычных операций ввода и выводас помощью терминала пользователя существуют специальные сог-лашения. Когда интерпретатор команд (
shell) прогоняет прог-рамму, он открывает три файла, называемые стандартным вво-дом, стандартным выводом и стандартным выводом ошибок, кото-рые имеют соответственно числа 0, 1 и 2 в качестве дескрип-торов этих файлов. В нормальном состоянии все они связаны стерминалом, так что если программа читает с дескрипторомфайла 0 и пишет с дескрипторами файлов 1 и 2, то она можетосуществлять ввод и вывод с помощью терминала, не заботясьоб открытии соответствующих файлов. Пользователь программы может перенаправлять ввод ивывод на файлы, используя в интерпретаторе команд символы
< и >:
prog <
infile >
outfile В этом случае интерпретатор команд изменит определениедескрипторов файлов 0 и 1 с терминала на указанные файлы.Обычно дескриптор файла 2 остается связанным с терминалом,так что сообщения об ошибках могут поступать туда. Подобныезамечания справедливы и тогда, когда ввод и вывод связан смежпроцессным каналом. Следует отметить, что в этом случаесвязь программы с файлами изменяется интерпретатором
shell (или
cshell), а не программой. Сама программа, пока онаиспользует файл 0 для ввода и файлы 1 и 2 для вывода, незнает ни откуда приходит ее ввод, ни куда поступает еевыдача.