Гарантируется ли args [0] путь выполнения?

Это фундаментальный вопрос, но важный, тем не менее ...

При запуске программы на C ++, основной метод которой имеет следующую общую подпись:

int main(int argc, char* args[]) {
    //Magic!
    return 0;
}

всегда ли args [0] всегда указывает путь к текущей запущенной программе? Как насчет кроссплатформенности (поскольку я нахожусь в среде Linux, но могу портировать позже)?

Ответы на вопрос(1)

Решение Вопроса

которое вы дали программе с помощью операционной системы. Например, при запуске программы с помощьюexec Вы можете установить это на произвольное значение:

int execve(const char *filename, char *const argv[],
           char *const envp[]);

Первым параметром является файл для запуска, и argv будет содержать argv [0] и все остальные параметры для main. envp содержит переменные среды (не определенные стандартом C или C ++. Это вещь posix).

Точнее, это определение argv в C ++:

Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена. Он должен иметь возвращаемый тип типа int, но в остальном его тип определяется реализацией. Все реализации должны позволять оба следующих определения main:

int main() { /* ... */ }

а также

int main(int argc, char* argv[]) { /* ... */ }

В последней форме argc должно быть числом аргументов, переданных программе из среды, в которой она запущена. Если argc отлично от нуля, эти аргументы должны быть указаны вargv[0] черезargv[argc-1] в качестве указателей на начальные символы многобайтовых строк с нулевым символом в конце (NTMBS) (17.3.2.1.3.2) иargv[0] должен быть указателем на начальный символ NTMBS, который представляет имя, используемое для вызова программы или "". Значение argc должно быть неотрицательным. Значениеargv[argc] должно быть 0. [Примечание: рекомендуется добавлять любые дополнительные (необязательные) параметры после argv. ]

Это в значительной степени зависит от реализации, которая определяет «имя, используемое для вызова программы». Если вы хотите получить полный путь к вашему исполняемому файлу, вы можете использоватьGetModuleFileName в Windows иargv[0] (для получения имени, используемого для выполнения, может быть относительным) вместе сgetcwd (для получения текущего рабочего каталога, пытаясь сделать имя абсолютным).

 Doug19 янв. 2009 г., 12:21
Я бы избегал realpath в переносимых программах. Интерфейс реального пути POSIX не работает, поскольку вы не можете ни указать размер целевого буфера, ни выделить один достаточно большой, не делая предположений о PATH_MAX.
 Johannes Schaub - litb19 янв. 2009 г., 14:40
Даг, ну хорошо. Я просто прочитал это на странице руководства.
 Johannes Schaub - litb21 дек. 2008 г., 04:32
... и bash знает, что он находится в режиме POSIX, сравнивая argv [0] с "sh" :), кстати, эта хитрость argv делает занятый ящик таким маленьким. все утилиты упакованы в один двоичный файл, который выполняется с разными значениями argv [0]
 Norman Ramsey21 дек. 2008 г., 04:27
Например, оболочка знает, что это оболочка входа в систему, потому что login (1) организует argv [0] для начала с тире.

Ваш ответ на вопрос