Когда может argv [0] иметь пустой указатель?

То, что я имею, понимают о передающих аргументах основному () из командной строки, - то, что argc имеет минимальное значение 1, и argv [0] будет всегда иметь название программы со своим путем в нем.

Если аргументы будут обеспечены в командной строке, то argc будет иметь значение больше, чем у одного и argv1 к argv [argc-1] будут те аргументы.

Теперь в абзаце в этой ссылке говорится это

argv [0] будет строкой, содержащей название программы или пустую строку, если это не будет доступно.

Теперь, как и когда может argv [0] иметь пустую строку? Я подразумеваю, что название программы с его путем всегда будет доступно поэтому, когда это сможет быть пустым?

Писатель говорит, что, "если это не доступно", но когда и как возможно, что название программы не будет доступно?

32
задан Ciro Santilli 新疆改造中心法轮功六四事件 17 February 2017 в 06:30
поделиться

3 ответа

В классе вызовов exec вы указываете имя программы и запрограммировать исполняемый файл по отдельности, чтобы затем вы могли установить для него значение NULL.

Но эта цитата на самом деле взята из стандарта ISO (возможно, перефразированного), и этот стандарт охватывает ужасно широкий диапазон сред выполнения, от самого маленького микроконтроллера до новейшего мэйнфрейма z10 Enterprise-класса.

Многие из этих встроенных систем могут оказаться в ситуации, когда имя исполняемого файла не имеет смысла.

Из последнего черновика c1x:

Значение argc должно быть неотрицательным.

Значение argv [argc] должно быть нулевым указателем.

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

Это означает, что если argc равен нулю (а это может быть), argv [0] имеет значение NULL.

Но даже если argc равно не 0, вы можете не получить имя программы, поскольку в стандарте также указано:

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

Таким образом, стандарт не требует указания имени программы. Я видел, как программы используют широкий набор опций для этого значения:

  • вообще никакого значения (для предполагаемой безопасности).
  • наглая ложь (например, сон для вредоносного кода).
  • фактическое имя программы (например, sleep ).
  • слегка измененный (например, -ksh для оболочки входа).
  • описательное имя (например, progname - программа для чего-то ).
31
ответ дан 27 November 2019 в 21:00
поделиться

Согласно ] этот список рассылки , argv [0] может иметь значение null, если argc == 0 . Но они не объясняют , когда argc может когда-либо быть нулевым. Я бы подозревал, что argc будет равен нулю в ситуациях, когда исполняемый файл не запускается «нормально» (например, через командную строку, popen и т. Д.) - и действительно, как упоминалось в @paxdiablo, вы можете вручную установить argv с помощью семейства функций exec , поэтому argc может быть нулевым в зависимости от этих аргументов.

Но в разделе Rationale :

Ранние предложения требовали, чтобы значение argc , передаваемое в main () , было «единица или больше» . Это было обусловлено тем же требованием в проектах стандарта ISO C. Фактически, исторические реализации передавали нулевое значение, когда вызывающей функции функции exec не передаются аргументы. Это требование было удалено из стандарта ISO C и впоследствии также удалено из этого тома IEEE Std 1003.1-2001.Формулировка, в частности, использование слова следует, требует, чтобы строго соответствующее приложение POSIX передавало по крайней мере один аргумент функции exec, таким образом гарантируя, что argc будет равен единице или больше при вызове таким приложением. Фактически, это хорошая практика, поскольку многие существующие приложения ссылаются на argv [0] без предварительной проверки значения argc .

Итак, вот и все: строго соответствующие приложения POSIX должны иметь argc больше нуля, но в противном случае это никоим образом не гарантируется.

В разделе Запуск программы есть немного дополнительной информации о стандарте, касающемся argc и argv .

7
ответ дан 27 November 2019 в 21:00
поделиться

Можно представить платформы, на которых программы не имеют имен - возможно, код просто загружается при запуске. В этих случаях argv [0] мог бы быть NULL. Стандарт C, безусловно, допускает нулевое значение argc и говорит, что argv [argc] должен быть NULL.

3
ответ дан 27 November 2019 в 21:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: