То, что я имею, понимают о передающих аргументах основному () из командной строки, - то, что argc имеет минимальное значение 1, и argv [0] будет всегда иметь название программы со своим путем в нем.
Если аргументы будут обеспечены в командной строке, то argc будет иметь значение больше, чем у одного и argv1 к argv [argc-1] будут те аргументы.
Теперь в абзаце в этой ссылке говорится это
argv [0] будет строкой, содержащей название программы или пустую строку, если это не будет доступно.
Теперь, как и когда может argv [0] иметь пустую строку? Я подразумеваю, что название программы с его путем всегда будет доступно поэтому, когда это сможет быть пустым?
Писатель говорит, что, "если это не доступно", но когда и как возможно, что название программы не будет доступно?
В классе вызовов 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 - программа для чего-то
). Согласно ] этот список рассылки , 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
.
Можно представить платформы, на которых программы не имеют имен - возможно, код просто загружается при запуске. В этих случаях argv [0] мог бы быть NULL. Стандарт C, безусловно, допускает нулевое значение argc и говорит, что argv [argc] должен быть NULL.