Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯЗЫК СИ_РУКОВОДСТВО ПРОГРАММИСТА.doc
Скачиваний:
12
Добавлен:
18.08.2019
Размер:
438.27 Кб
Скачать

6.1. Ввод и обработка командной строки

Командная строка в данном контексте - строка символов, завершенная символами <ВК> или <ПС>. В командной строке символы пробела являются разделителями аргументов. Аргументом считается последовательность символов, не включающая пробелов, или последовательность произвольных символов, заключенная в одинарные или двойные кавычки, например, строка:

param1 param2 "a a a" '"e"'

содержит 4 аргумента:

param1

param2

a a a

"e"

Если программа запущена из командного файла, то командная строка тоже будет взята из командного файла. Если программа запущена с терминала, то она выведет на терминал приглашение "# " и будет ожидать ввода командной строки. приглашение для ввода командной строки можно изменить, см. ниже.

Если явно не запрещено (см. ниже), то перед вводом командной строки разрешается ввод символов нижнего регистра. Существует еще одна возможность передать программе команднуЮ строку: если программа запущена макрокомандой ". CHAIN" из другой программы, то программа вводит команднуЮ строку из области связи (начиная с адреса 0512 и до первого байта '\0'). При разборе командной строки выделяЮтся аргументы, и информация о них передается главной функции программы пользователя "main()" при помощи двух параметров, которые обычно называЮт "argc" и "argv". "argc" имеет тип "int" и содержит число аргументов, переданных функции, "argv" имеет тип "char **" и является указателем на массив указателей на аргументы (каждый аргумент при разборе завершается символом '\0'). Для совместимости с ОС UNIX функции "main()" передается на один аргумент больше, чем их (аргументов) выделено из командной строки. Дополнительный аргумент является первым и в данной системе он содержит строку "XXXX". В ОС UNIX этот аргумент формируется интерпретатором команд "shell" и, Jобычно, содержит имя программы. Благодаря наличию дополнительного аргумента параметр "argc" не может быть меньше 1. Приведем пример программы, печатающей свои аргументы:

main(argc, argv)

int argc;

char* argv[];

int i;

printf("программа имеет %d аргументов:\n",

argc);

for(i=0; i < argc; i++)

printf("ARG %d = \"%s\"\n", i, argvi);

при вызове этой программы с командной строкой

abc "def ghi" 122 'm m' получим:

программа имеет 5 аргументов:

ARG 0 = "XXXX"

ARG 1 = "abc"

ARG 2 = "def ghi"

ARG 3 = "122"

ARG 4 = "m m"

Командная строка может содержать аргументы вида "<file" и ">file", т.е. аргументы, состоящие из символа '<' или '>' и следующей за этим символом без пробела спецификации файла в формате CSI. Такие аргументы не передаются функции "main()", а вызывают перенаправление ввода/вывода. Вот что это означает: при старте программы открываются три файла:

stdin - файл стандартного ввода

stdout - файл стандартного вывода

stderr - файл стандартного вывода ошибок

Все эти файлы по умолчанию связаны с терминалом, однако файлы стандартного ввода и вывода могут быть перенаправлены на другие устройства или файлы при помощи специальных аргументов командной строки:

Если в командной строке присутствует аргумент вида "<file", то "stdin" будет связан с файлом "file", а не с терминалом; точно также, при присутствии аргумента вида ">file" "stdout" будет связан с файлом "file". рассмотрим следующую программу:

# include <stdio.h>

main()

register c;

while ((c = getchar()) != eof) putchar(c);

Если командная строка пуста, то эта программа вводит символы с терминала и выводит их обратно на терминал, однако, задав командную строку <a.c >b.c

При помощи этой программы мы скопируем файл "a.c" в файл "b.c". При перенаправлении стандартного вывода в спецификации файла ("file") может быть указана длина, она обрабатывается обычным образом. Сообщения исполняющей системы при старте при выполнении стартовых действий в функции $$init() могут возникать ошибки. При появлении ошибки выводится диагностика и выполнение программы прекращается.

Диагностики следующие (в сообщениях использованы малые латинские буквы, которые на некоторых терминалах будут отображаться как большие русские):

"?io-start-cannot parse command line"

- ошибка при разборе командной строки

"?io-start-no memory"

- недостаточно динамической памяти

"?io-start-cannot open standard input "file", code = dd."

ошибка открытия файла "file" при перенаправлении

файла стандартного ввода. код ошибки dd.

"?io-start-cannot open standard output "file", code = dd."

ошибка открытия файла "file" при перенаправлении

файла стандартного вывода. код ошибки dd.

Значение ошибки с определенным кодом см. приложение 2.