Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс ПЯВУ 2 сем / Лекции 2 сем / Л№35.Аргументы кс / Лекция № 30.Аргументы командной строки..odt
Скачиваний:
12
Добавлен:
17.04.2015
Размер:
58.31 Кб
Скачать

Лекция № . Аргументы командной строки.

Содержание лекции.

    1. Понятие аргументов командной строки.

    2. Механизм передачи АКС в программу.

    3. Доступ к аргументам командной строки.

    4. Параметры операционной системы.

    5. Функция geteuv/

    6. Расшифровка командной строки.

    7. Запус и окончание работы программы.

    8. Синтаксические соглашения аргументов программы.

    9. Опции программы синтаксического анализа.

    10. Синтаксический анализ длинных опций.

    11. Переменные среды.

    12. Доступ к среде.

    13. Стандартные переменные среды

    14. Завершение программы.

    15. Прерывание выполнения программы.

    16. Внутренняя организация окончания работы программы.

    17. Ввод вывод файлов с помощью командной строки.

    18. Массивы указателей.

    19. Указатели на указатели.

    20. Окрытие файлов.

    21. Вопросы для самопроверки.

          1. Понятие аргументов командной строки.

Подавляющее большинство ПО для Linux и Unix использует для своей работы аргументы командной строки. Даже программы с графическим интерфейсом, которым, казалось бы, и вовсе не нужна консоль, интерпретируют десятки входных параметров. Это может быть задание начальных настроек, включение отладочного режима или просто вывод версии программы без её запуска. В общем, аргументы используются повсеместно – так уж исторически сложилось в Unix-системах. Ну, а раз без аргументов никуда, надо уметь с ними работать. К счастью, библиотеки Unix и здесь придут вам на помощь... но давайте обо всем по порядку.

2. Механизм передачи аргументов командной строки в программу.

Вначале был argv...

Основная функция любой C/C++ программы описывается следующим образом:

int main (int argc, char *argv[] { . . . };

Или так – это вопрос вкуса:

int main (int argc, char **argv) { . . . };

Массив argv содержит аргументы командной строки, argc указывает, сколько их всего было передано, причем имя программы также включается сюда: оно доступно как argv[0]. Поэтому, чтобы работать с командной строкой, самым простым программам вполне хватало параметров функции main().

3. Доступ к аргументам командной строки

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

Аргументы командной строки — это множество слов, из которых состоит командная строка.

В функцию main() при передаче управления всегда передаются два аргумента. В программе они могут игнорироваться и, следовательно, не обрабатываться. Чтобы получить доступ к аргументам командной строки, в определении функции main() в круглых скобках после идентификатора main должны быть объявлены два формальных параметра.

argc (сокращение от argument count)- первый параметр функции main(), имеет смысл счетчика аргументов. Это количество слов, на которые разбивается символами промежутков командная строка.

argv (сокращение от argument vector- вектор аргументов) — второй параметр функции main(). Во время выполнения программы на языке Си слова из командой строки размещены в виде символьных строк в программном адресном пространстве. В этой же памяти запоминается и завершаемый нулем (NULL) массив адресов (указателей) этих строк.

//Вывод на печать аргументовкомандной строки

#include <stdio.h>

#include <stdlib.h>

int main (int argc, char *argv[])

{

int i;

printf ("number of words: %d\n", argc);

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

printf ("%s\n", argv [i]);

system("pause");

return 0;

}

//number of words: 1 - argc

//C:\Users\ \ o1.exe -argv[0]

Здесьargv объявляется как массив указателей на символьные значения. argv[0] – это адрес, по которому хранится первое слово ( в прим. 1 это a.out); argv[1] — адрес второго слова и т.д.

Рис. 1. Пример командной строки

Использование двукратного указателя для доступа к командной строке

Второй параметр функции main() argv — это двукратный указатель.

/* печатает аргументы командной строки, используя argv как двукратный указатель*/

#include <stdio.h>

int main(int argc, char **argv)

{

for(; *argv != NULL; argv++)

printf("%s\n", * argv);

}

4. Параметры операционной системы.

Функция main может иметь и третий параметр, который принято называть argp, и который служит для передачи в функцию main параметров операционной системы (среды) в которой выполняется СИ-программа.

Заголовок функции main имеет вид:

int main (int argc, char *argv[], char *argp[])

Если, например, командная строка СИ-программы имеет вид:

A:\>cprog working 'C program' 1

то аргументы argc, argv, argp представляются в памяти как показано в схеме на рис.1.

argc [ 4 ]

argv [ ]--> [ ]--> [A:\cprog.exe\0]

[ ]--> [working\0]

[ ]--> [C program\0]

[ ]--> [1\0]

[NULL]

argp [ ]--> [ ]--> [path=A:\;C:\\0]

[ ]--> [lib=D:\LIB\0]

[ ]--> [include=D:\INCLUDE\0]

[ ]--> [conspec=C:\COMMAND.COM\]

[NULL]

Рис.1. Схема размещения параметров командной строки

Операционная система поддерживает передачу значений для параметров argc, argv, argp, а на пользователе лежит ответственность за передачу и использование фактических аргументов функции main.

Следующий пример представляет программу печати фактических аргументов, передаваемых в функцию main из операционной системы и параметров операционной системы.

//Вывод аргументов и параметров операционной системы

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int main ( int argc, char *argv[], char *argp[])

{ int i=0;

printf("Kolithestvo argumentov = %i \n",argc);

printf ("\n Imja programmy %s", argv[0]);

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

printf ("\n argument %d raven %s",i, argv[i]);

printf ("\n Parametry operathionnoy systemy: ");

while (*argp)

{ printf ("\n %s",*argp);

argp++;

}

system("pause");

return 0;

}

5. Функция geteuv().

Доступ к параметрам операционной системы можно также получить при помощи библиотечной функции geteuv, ее прототип имеет следующий вид:

char *geteuv (const char *varname);

Аргумент этой функции задает имя параметра среды, указатель на значение которой выдаст функция geteuv. Если указанный параметр не определен в среде в данный момент, то возвращаемое значение NULL.

Используя указатель, полученный функцией geteuv, можно только прочитать значение параметра операционной системы, но нельзя его изменить. Для изменения значения параметра системы предназначена функция puteuv.

Компилятор языка СИ строит СИ-программу таким образом, что вначале работы программы выполняется некоторая инициализация, включающая, кроме всего прочего, обработку аргументов, передаваемых функции main, и передачу ей значений параметров среды. Эти действия выполняются библиотечными функциями _setargv и _seteuv, которые всегда помещаются компилятором перед функцией main.

Если СИ-программа не использует передачу аргументов и значений параметров операционной системы, то целесообразно запретить использование библиотечных функций _setargv и _seteuv поместив в СИ-программу перед функцией main функции с такими же именами, но не выполняющие никаких действий (заглушки). Начало программы в этом случае будет иметь вид:

_setargv()

{ return ; /* пустая функция */

}

-seteuv()

{ return ; /* пустая функция */

}

int main()

{ /* главная функция без аргументов */

...

...

renurn (0);

}

В приведенной программе при вызове библиотечных функций _setargv и _seteuv будут использованы функции помещенные в программу пользователем и не выполняющие никаких действий. Это заметно снизит размер получаемого exe-файла.