“argv [0] = имя исполняемого файла” принятый стандарт или просто общая конвенция?

Когда передающий аргумент main() в C или приложении C++, будет argv[0] всегда будьте названием исполняемого файла? Или это - просто общая конвенция и не гарантируемое быть истинные 100% времени?

91
задан Charles 11 February 2012 в 21:57
поделиться

6 ответов

Угадаются (даже образованные догадки) - это весело, но вам действительно нужно перейти к стандартам документы чтобы быть уверенным. Например, ISO C11 состояния (мой акцент):

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

Так что нет, это только имя программы, если это имя доступно. И это »представляет собой« имя программы, не обязательно - это имя программы. Раздел до этого состояния:

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

Это неизменяется от C99, предыдущий стандарт, и означает, что даже значения не продиктованы стандартом - это зависит от реализации полностью.

Это означает, что имя программы может быть пустым, если прилагают его , и что-то еще, если прилагают его , при условии, что «что-нибудь еще «Каким-то образом представляет имя программы. В моих садистских моментах я бы считал перевести его в Суахили, пробегая его через зазубрение шифра, а затем хранить его в порядке обратного байта :-).

Однако, определенные в реализации имеют определенное значение в стандартах ISO - реализация должна документировать, как она работает. Так что даже Unix, которое может поставить все, что он любит в ARGV [0] с помощью семейства звонков , должен (и делает) документировать его.

106
ответ дан 24 November 2019 в 06:47
поделиться

Диапазон (N) начинается с 0 , а не 1 . 0 * J всегда будет меньше n .

-121--3758881-

Я не уверен, является ли это почти универсальная конвенция или стандарт, но и в любом случае, если вы должны соблюдать его. Я никогда не видел, что это эксплуатируется за пределами Unix и Unix-подобных систем, хотя. В средах Unix - и, возможно, особенно в старых днях - программы могут иметь значительно разное поведение в зависимости от имени, при котором они вызываются.

Отредактировано: я вижу с других постов одновременно, как мой, что кто-то определил его как поступал из определенного стандарта, но я уверен, что Конвенция долго предписывает стандарт.

2
ответ дан 24 November 2019 в 06:47
поделиться

в соответствии со стандартом C ++, раздел 3.6.1:

ARGV [0] указатель на Начальный характер NTMBS, который представляет имя, используемое для вызова Программа или «»

Так что нет, это не гарантируется, по крайней мере, по стандарту.

8
ответ дан 24 November 2019 в 06:47
поделиться

Windows 2008 имеет модель безопасности, отличную от модели Windows 2003, и она управляется XML-файлом, который содержит полную загрузку записей безопасности. Я еще не вдавался в это подробно, так что я могу только начать.

Выберите Admin Tools - > Мастер настройки безопасности. Найдите текущую политику безопасности (не знаете, где она хранится, но технет скажет вам). Перейдите к списку и проверьте наличие распределенных транзакций. По умолчанию они не проверяются. Примените новую политику.

Будьте осторожны с использованием этой утилиты, поскольку u может серьезно взломать вашу систему или открыть защитное отверстие. Надеюсь, это поможет. Боб.

-121--2867209-

i начинается с 0 , поэтому условие пока остается всегда верным; для получения более подробной информации см. документы по диапазону .

-121--3758875-

ISO-IEC 9899 заявляет:

5,1,2,2,1 Запуск программы

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

Я также использовал:

#if defined(_WIN32)
  static size_t getExecutablePathName(char* pathName, size_t pathNameCapacity)
  {
    return GetModuleFileNameA(NULL, pathName, (DWORD)pathNameCapacity);
  }
#elif defined(__linux__) /* elif of: #if defined(_WIN32) */
  #include <unistd.h>
  static size_t getExecutablePathName(char* pathName, size_t pathNameCapacity)
  {
    size_t pathNameSize = readlink("/proc/self/exe", pathName, pathNameCapacity - 1);
    pathName[pathNameSize] = '\0';
    return pathNameSize;
  }
#elif defined(__APPLE__) /* elif of: #elif defined(__linux__) */
  #include <mach-o/dyld.h>
  static size_t getExecutablePathName(char* pathName, size_t pathNameCapacity)
  {
    uint32_t pathNameSize = 0;

    _NSGetExecutablePath(NULL, &pathNameSize);

    if (pathNameSize > pathNameCapacity)
      pathNameSize = pathNameCapacity;

    if (!_NSGetExecutablePath(pathName, &pathNameSize))
    {
      char real[PATH_MAX];

      if (realpath(pathName, real) != NULL)
      {
        pathNameSize = strlen(real);
        strncpy(pathName, real, pathNameSize);
      }

      return pathNameSize;
    }

    return 0;
  }
#else /* else of: #elif defined(__APPLE__) */
  #error provide your own implementation
#endif /* end of: #if defined(_WIN32) */

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

4
ответ дан 24 November 2019 в 06:47
поделиться

Необходимо вызвать метод 'option' , например:

dlgPrompt.dialog('option', 'buttons', {
    'Ok': function() {
        myFunction();
        $(this).dialog('close');
    }
});
-121--2137732-

Относительно ваших вопросов, позвольте мне обратиться к ним по порядку и привести несколько примеров:

1 ) Список возвращается, если и когда оператор return добавляет один. Рассмотрим

 R> retList <- function() return(list(1,2,3,4)); class(retList())
 [1] "list"
 R> notList <- function() return(c(1,2,3,4)); class(notList())
 [1] "numeric"
 R> 

2 ) Имена просто не установлены:

R> retList <- function() return(list(1,2,3,4)); names(retList())
NULL
R> 

3 ) Они не возвращают то же самое. В примере приводится

R> x <- list(1,2,3,4)
R> x[1]
[[1]]
[1] 1
R> x[[1]]
[1] 1

, где x [1] возвращает первый элемент x - то же самое, что и x . Каждый скаляр является вектором длины 1. С другой стороны, x [[1]] возвращает первый элемент списка.

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

-121--544021-

На этой странице указано:

Элемент argv [0] обычно содержит имя программы, но на это не следует полагаться - в любом случае для программы необычно не знать своего имени!

Однако на других страницах создается резервная копия того факта, что это всегда имя исполняемого файла. Этот гласит:

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

4
ответ дан 24 November 2019 в 06:47
поделиться

В системах типа *nix с вызовами exec*(), argv[0] будет тем, что вызывающий абонент поместит в пятно argv0 в вызове exec*().

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

Но мошенническая программа Unix может вызывать exec() и делать argv[0] всё, что ей нравится, так что независимо от того, что говорит стандарт Си, вы не можете рассчитывать на это в 100% случаев.

45
ответ дан 24 November 2019 в 06:47
поделиться