Чтение онлайн

ЖАНРЫ

Основы программирования в Linux
Шрифт:

Вы можете встретить программы на языке С для ОС 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: %s\n", argv[arg]+1);

else

printf("argument %d: %s\n", 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
.

getopt

Для того чтобы вам легче было следовать правилам, приведенным в этих руководствах, ОС Linux предлагает очень простое в применении средство

getopt
, поддерживающее использование опций со значениями и без них.

#include <unistd.h>

int getopt(int argc, char *const argv[], const char *optstring);

extern char *optarg;

extern int optind, opterr, optopt;

Функция

getopt
принимает параметры
argc
и
argv
в том виде, в каком они передаются функции
main
в программе, и строку спецификатора опций, которая сообщает
getopt
, какие опции определены для программы и есть ли у них связанные с ними значения.
optstring
— это просто список символов, каждый из которых представляет односимвольную опцию. Если за символом следует двоеточие, это означает, что у опции есть ассоциированное значение, которое будет принято как следующий аргумент. Команда
getopt
оболочки bash выполняет аналогичную функцию.

Поделиться с друзьями: