Операционная система UNIX. Руководство программиста

     

Как аргументы передаются в программу


Информация или управляющие параметры могут передаваться в программу как аргументы командной строки при запуске программы. При этом указанные в командной строке аргументы передаются функции main() через два ее параметра, первый из которых содержит количество аргументов, а второй является массивом указателей на цепочки символов, содержащие передаваемую в качестве аргументов информацию (выполнение любой C-программы начинается с функции с именем main). Заметим, что поскольку количество аргументов программы передается ей во время запуска, программа не обязана знать заранее, сколько аргументов следует ожидать.

Обычно параметры функции main() имеют имена argc и argv, хотя это и не обязательно. argc - целое число, равное количеству передаваемых аргументов. Это число всегда больше или равно 1, поскольку сама команда считается первым аргументом, и argv[0]

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

Если во время запуска программы ей будут передаваться аргументы, следует в тексте программы предусмотреть их обработку. Передаваемая информация может, например, содержать:

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

Приведем примеры фрагментов программ, иллюстрирующих эти два способа использования аргументов программы.

#include <stdio.h> #define FALSE 0 #define TRUE 1

main (argc, argv) int argc; char *argv []; { void exit (); int oflag = FALSE; int pflag = FALSE; /* Функциональные флаги */ int rflag = FALSE; int ch;

while ((ch = getopt (argc, argv, "opr")) != EOF) { /* Если имеются опции, присвоить флагам TRUE. Если опций нет, вывести сообщение об ошибке */ switch (ch) { case 'o': oflag = TRUE; break; case 'p': pflag = TRUE; break; case 'r': rflag = TRUE; break; default: (void) fprintf (stderr, "Использование: %s [-opr]\n", argv [0]); exit (2); } } . . . }


#include <stdio.h>

main (argc, argv) int argc; char *argv []; { FILE *fopen (), *fin; void perror (), exit ();

if (argc > 1) { if ((fin = fopen (argv [1], "r")) == NULL) { /* Первое %s - для вывода имени программы. Второе %s - для вывода имени файла, который не удалось открыть */ (void) fprintf (stderr, "%s: неудача при попытке открыть файл %s: ", argv [0], argv [1]); perror (""); exit (2); } } . . . }

При разборе shell'ом командной строки аргументами считаются любые последовательности непробельных символов, разделенные пробелами или знаками табуляции. Последовательность символов, заключенных в двойные кавычки (например, "abc def"), считается одним аргументом, даже если в ней встречаются пробелы или табуляции. Разумеется, проверка корректности передаваемых аргументов полностью возлагается на программиста.

Кроме argc и argv, у функции main() есть еще один параметр, обычно обозначаемый как envp. Это массив указателей на цепочки символов, образующих окружение. Более подробная информация о envp имеется в Справочнике программиста в статьях exec(2) и environ(5).




Содержание раздела