Доступ к аргументам команды

Операционная система ДЕМОС позволяет передавать аргу-менты команды начинающей выполняться программе. Когда функ-ция 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 для вывода, незнает ни откуда приходит ее ввод, ни куда поступает еевыдача.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: