Обработка `argv` в программе командной строки C - PullRequest
7 голосов
/ 10 августа 2010

Я прочитал, что первый член массива argv всегда будет именем программы.

Полезно ли когда-нибудь держаться за это?Я учусь, так что извините, пожалуйста, если это глупый вопрос.

Люди когда-либо отменяют переключение первого члена, потому что он бесполезен (и сбрасывает argv, чтобы быть на один меньше?), Или оставляет егоесть лучшая практика, потому что люди ожидают, что она всегда будет там (и чтобы она работала «из коробки» с argc)?

Ответы [ 6 ]

7 голосов
/ 10 августа 2010

Я прочитал, что первый член массива argv всегда будет именем программы.

Это должно быть. C и C ++ требуют, чтобы, если argc больше нуля, argv[0] было либо именем программы, либо пустой строкой.

Некоторые системы не обязательно следуют этому соглашению при любых обстоятельствах (например, в Windows вы можете использовать CreateProcess для создания нового процесса и не передавать имя программы в аргументах командной строки, которые используются для заполнения argc и argv).

Полезно ли когда-нибудь держаться за это?

Конечно. Например, если вы хотите создать другой экземпляр себя или напечатать имя вашей программы (например, в инструкциях по использованию).

Люди когда-нибудь снимают с себя первого члена, потому что это бесполезно, или оставляют его там лучшей практикой?

Не меняйте фактические аргументы; следующий человек, который придет, вероятно, будет ожидать, что они будут в их первоначальной форме.

4 голосов
/ 10 августа 2010

Если быть точным, argv[0] - это то, что передается в exec (2), который обычно является именем программы, но может быть любым.

Не снимайте его, потому что на него рассчитывает слишком много скрытых зависимостей.

3 голосов
/ 10 августа 2010

Первый аргумент не всегда является именем программы - он зависит от того, как она называется (см. здесь ).

Часто, argv[0] используется в тексте справки:

fprintf(stderr, "Usage: %s <foo> [bar]\n", argv[0]);

Смещение массива не очень полезно и не эффективно. Вы также можете просто начать использовать argv из индекса 1.

3 голосов
/ 10 августа 2010

Ожидается, что argv [0] всегда будет содержать имя исполняемого файла. Из-за этого вы никогда не должны удалять его.

Что касается того, полезно ли это, можно использовать argv [0], если вы хотите, чтобы ваше приложение изменило поведение в зависимости от того, как оно было вызвано.

Busybox , например, использует это во встроенных системах Linux. Обычно у вас будет одна копия исполняемого файла и вы создадите символические ссылки на исполняемый файл с разными именами. например. cp, rm, ls и т. д. Затем Busybox определяет, какую функцию выполнять, основываясь на содержимом argv [0].

0 голосов
/ 10 августа 2010

Из ISO C99, §5.1.2.2.1,

Если значение argc больше нуля, строка, на которую указывает argv [0], представляет имя программы; argv [0] [0] должен быть нулевым символом, если имя программы недоступно из среды хоста.

Следовательно, при соответствующих реализациях вы можете положиться на argv[0] как имя программы , если вы проверяли его существование раньше (то есть, если вы можете утверждать, что argc > 0).

0 голосов
/ 10 августа 2010

Содержимое argv [0] не определено ANSI. argv может перечислять:

main(int argc,char**argv)
{
  while( argc-- )
    puts(*argv++);
  return 0;
}
...