Когда передающий аргумент main()
в C или приложении C++, будет argv[0]
всегда будьте названием исполняемого файла? Или это - просто общая конвенция и не гарантируемое быть истинные 100% времени?
Угадаются (даже образованные догадки) - это весело, но вам действительно нужно перейти к стандартам документы чтобы быть уверенным. Например, ISO C11 состояния (мой акцент):
Если значение
ARGC
больше нуля, строка, указанная наARGV [0]
, представляет Имя программы;ARGV [0] [0]
должен быть нулевым символом, если имя программы недоступен в хост-среде.
Так что нет, это только имя программы, если это имя доступно. И это »представляет собой« имя программы, не обязательно - это имя программы. Раздел до этого состояния:
, если значение
ARGC
больше нуля, члены массиваARGV [0]
черезARGV [ARGC-1]
включительно должен содержать указатели на строки, которые дают определенные внедрение значений в хост-среде перед запуском программы.
Это неизменяется от C99, предыдущий стандарт, и означает, что даже значения не продиктованы стандартом - это зависит от реализации полностью.
Это означает, что имя программы может быть пустым, если прилагают его , и что-то еще, если прилагают его , при условии, что «что-нибудь еще «Каким-то образом представляет имя программы. В моих садистских моментах я бы считал перевести его в Суахили, пробегая его через зазубрение шифра, а затем хранить его в порядке обратного байта :-).
Однако, определенные в реализации имеют определенное значение в стандартах ISO - реализация должна документировать, как она работает. Так что даже Unix, которое может поставить все, что он любит в ARGV [0]
с помощью семейства звонков
, должен (и делает) документировать его.
Диапазон (N)
начинается с 0
, а не 1
. 0 * J
всегда будет меньше n
.
Я не уверен, является ли это почти универсальная конвенция или стандарт, но и в любом случае, если вы должны соблюдать его. Я никогда не видел, что это эксплуатируется за пределами Unix и Unix-подобных систем, хотя. В средах Unix - и, возможно, особенно в старых днях - программы могут иметь значительно разное поведение в зависимости от имени, при котором они вызываются.
Отредактировано: я вижу с других постов одновременно, как мой, что кто-то определил его как поступал из определенного стандарта, но я уверен, что Конвенция долго предписывает стандарт.
в соответствии со стандартом C ++, раздел 3.6.1:
ARGV [0] указатель на Начальный характер NTMBS, который представляет имя, используемое для вызова Программа или «»
Так что нет, это не гарантируется, по крайней мере, по стандарту.
Windows 2008 имеет модель безопасности, отличную от модели Windows 2003, и она управляется XML-файлом, который содержит полную загрузку записей безопасности. Я еще не вдавался в это подробно, так что я могу только начать.
Выберите Admin Tools - > Мастер настройки безопасности. Найдите текущую политику безопасности (не знаете, где она хранится, но технет скажет вам). Перейдите к списку и проверьте наличие распределенных транзакций. По умолчанию они не проверяются. Примените новую политику.
Будьте осторожны с использованием этой утилиты, поскольку u может серьезно взломать вашу систему или открыть защитное отверстие. Надеюсь, это поможет. Боб.
-121--2867209- i
начинается с 0
, поэтому условие пока
остается всегда верным; для получения более подробной информации см. документы по диапазону .
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) */
А затем вы просто должны проанализировать последовательность, чтобы извлечь имя исполняемого файла из пути.
Необходимо вызвать метод '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].
В системах типа *nix
с вызовами exec*()
, argv[0]
будет тем, что вызывающий абонент поместит в пятно argv0
в вызове exec*()
.
Оболочка использует соглашение о том, что это имя программы, и большинство других программ следуют этому же соглашению, так что argv[0]
обычно является именем программы.
Но мошенническая программа Unix может вызывать exec()
и делать argv[0]
всё, что ей нравится, так что независимо от того, что говорит стандарт Си, вы не можете рассчитывать на это в 100% случаев.