Книга: Основы программирования в Linux
Аргументы программы
Когда в ОС Linux или UNIX выполняется программа на языке С, она начинается с функции main
. В таких программах функция main
объявляется следующим образом:
int main(int argc, char *argv[])
Здесь argc
— это счетчик аргументов программы, a argv
— массив символьных строк, представляющих сами аргументы.
Вы можете встретить программы на языке С для ОС Linux, просто объявляющие функцию main
как
main()
Этот вариант тоже работает, поскольку по умолчанию возвращаемому функцией значению будет назначен тип int
, а формальные параметры, которые в функции не применяются, не нуждаются в объявлении. Параметры argc
и argv
остаются на своем месте, но если вы не объявляете их, то и не можете их использовать.
Каждый раз, когда операционная система запускает новую программу, параметры argc
и argv
устанавливаются и передаются функции main
. Обычно эти параметры предоставляются другой программой, часто командной оболочкой, которая запросила у операционной системы запуск новой программы. Оболочка принимает заданную командную строку, разбивает её на отдельные слова и использует их для заполнения массива argv
. Помните о том, что до установки параметров argc
и argv
командная оболочка Linux обычно выполняет раскрытие метасимволов в аргументах, содержащих имена файлов, в то время как оболочка MS-DOS рассчитывает на то, что программы примут аргументы с метасимволами и выполнят собственную постановку.
Например, если мы дадим командной оболочке следующую команду:
$ myprog left right 'and center'
программа myprog запустит функцию main
с приведенными далее параметрами.
argc: 4
argv: {"myprog", "left", "right", "and center"}
Обратите внимание на то, что аргумент-счётчик содержит имя программы и в массив argv
оно включено как первый элемент argv[0]
. Поскольку в команде оболочки мы применили кавычки, четвертый аргумент представляет собой строку, содержащую пробелы.
Вам все это знакомо, если вы программировали на языке С стандарта ISO/ANSI, Аргументы функции main
соответствуют позиционным параметрам в сценариях командной оболочки: $0
, $1
и т.д. Язык ISO/ANSI С заявляет, что функция main
должна возвращать значение типа int
, спецификация X/Open содержит явное объявление, данное ранее.
Аргументы командной строки удобны для передачи данных программам. Например, вы можете применить их в приложениях баз данных для передачи имени базы данных, которую хотите использовать, что позволит вам применить одну и ту же программу для работы с несколькими базами данных. Многие утилиты также используют аргументы командной строки для изменения собственного поведения или установки опций. Вы обычно задаете эти так называемые флаги или переключатели с помощью аргументов командной строки, начинающихся со знака "дефис". Например, программа sort
принимает переключатель для изменения обычного порядка сортировки на обратный:
$ sort -r файл
Опции командной строки используются очень широко, и согласованное их применение будет реальной помощью тем, кто станет использовать вашу программу. В прошлом у каждой утилиты был свой подход к формированию опций командной строки, что приводило к некоторой путанице. Например, взгляните на то, каким способом приведенные далее команды принимают параметры:
$ tar cvfB /tmp/file.tar 1024
$ dd if=/dev/fd0 of=/trap/file.dd bs=18k
$ ps ax
$ gcc --help
$ ls -lstr
$ ls -l -s -t -r
Мы рекомендуем в ваших приложениях все переключатели командной строки начинать с дефиса и делать их односимвольными, состоящими из одной буквы или цифры. При необходимости опции, не содержащие последующих аргументов, могут группироваться вместе после общего дефиса. Таким образом, два только что приведенных примера с командой ls
соответствуют нашим рекомендациям. За каждой опцией может следовать любое необходимое ей значение как отдельный аргумент. Пример с программой dd
нарушает наше правило, поскольку использует многосимвольные опции, которые начинаются совсем не с дефисов (if=/dev/fd0
): в примере с программой tar
опции полностью оторваны от своих значений! Целесообразно добавлять более длинные и информативные имена переключателей как альтернативу односимвольных вариантов и использовать двойной дефис для их выделения. Таким образом, у нас могут быть два варианта опции получения помощи: -h
и --help
.
Еще один недостаток некоторых программ — создание опции +x
(например) для выполнения функции, противоположной -х
. В главе 2 мы применяли команду set -о xtrace
для включения отслеживания действий командной оболочки и команду set +о xtrace
для выключения этого режима.
Вы, вероятно, можете сказать, что запомнить порядок и назначение всех этих программных опций достаточно трудно без необходимости освоения вызывающих идиосинкразию форматов. Часто единственный выход — применение опции -h
(от англ. help) или страниц интерактивного справочного руководства (man
), если программист предоставил одну из этих возможностей. Чуть позже в этой главе мы покажем, что функция getopt
предоставляет изящное решение этих проблем. А сейчас, тем не менее, в упражнении 4.1 давайте посмотрим, как передаются аргументы программы.
Упражнение 4.1. Аргументы программы
Далее приведена программа args.c, проверяющая собственные аргументы.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int arg;
for (arg = 0; arg < argc; arg++) {
if (argv[arg][0] == '-')
printf("option: %sn", argv[arg]+1);
else
printf("argument %d: %sn", arg, argv[arg]);
}
exit(0);
}
Когда вы выполните эту программу, она просто выведет свои аргументы и определит опции. Суть в том, что программа принимает строковый аргумент и необязательный аргумент с именем файла, вводимый опцией -f
. Могут быть определены и другие опции.
$ ./args -i -lr 'hi there' -f fred.c
argument 0: ./args
option: i
option: lr
argument 3: hi there option: f
argument 5: fred.с
Как это работает
Программа просто использует аргумент-счетчик argc
для задания цикла, просматривающего все аргументы программы. Она находит опции поиском начального дефиса.
В данном примере, если мы предполагаем, что доступны опции -l
и -r
, то упускаем тот факт, что группа -lr
, возможно, должна интерпретироваться так же, как -l
и -r
.
В стандарте X/Open (который можно найти по адресу http://opengroup.org/) определено стандартное применение опций командной строки (Utility Syntax Guidelines, руководство по синтаксису утилит) и стандартный программный интерфейс для представления переключателей командной строки в программах на языке С: функция getopt
.
- Сердечные аргументы
- 4.2. Представление базовой структуры программы
- Листинг 3.3. (fork.c) Ветвление программы с помощью функции fork()
- 10.3.1. Аргументы программы
- 6.2 Аргументы программы: vis версия 2
- СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- Аргументы функции в Python
- 1.2.5. Пример программы
- 24.7. Использование программы-твикера
- Часть III Прикладные программы
- Цикл создания программы