Я хочу получить полный путь к текущему процессу.
Я использую _getcwd
для получения текущего рабочего каталога. Но это не включает имя файла.
Как получить имя файла, например: filename.exe
?
В окнах вы можете использовать:
TCHAR szExeFileName[MAX_PATH];
GetModuleFileName(NULL, szExeFileName, MAX_PATH);
szExeFileName будет содержать полный путь + имя исполняемого файла
[править]
Для более портативного решения используйте argv[0]
или какой-либо другой код на платформе. Здесь вы можете найти такой подход: https://github.com/mirror/boost/blob/master/libs/log/src/process_name.cpp.
argv[0]
вашей основной функции является ваше имя файла.
Простой фрагмент кода:
#include<stdio.h>
int main(int argc,char** argv)
{
//access argv[0] here
}
В Linux имя файла вашего двоичного файла является адресом символической ссылки в /proc/self/exe
. Системный вызов readlink
можно использовать для поиска адресата символической ссылки.
Обратите внимание, что это указывает вам фактическое местоположение на диске, где хранится двоичный файл, а не просто команда, которую пользователь использовал для запуска вашей программы.
Обычно вы можете получить имя исполняемого файла из argv[0]
:
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("Running: %s\n", argv[0]);
return 0;
}
Действительно, есть способы приложения к execl()
другому приложению (или другой подобной функции) и переопределить этот аргумент. Для системы все равно нетипично изменить ее для такого рода приложений.
Как уже упоминалось, имя вашего исполняемого файла содержится в argv [0]. Если вам это нужно, вы можете:
cout << argv[0] << endl;
Если вам нужно имя исходного файла исполняемого файла, С++ имеет предопределенный макрос, который вы можете использовать:
cout << __FILE__ << endl;
Перейдите к здесь и выделите “Предопределенные имена макросов”
Вы можете использовать program_invocation_name из errno.h
В Linux (POSIX?) есть переменная среды, называемая _
, которая содержит текущий процесс.
$ echo $_
echo
В С++
#include <stdlib.h> /* getenv */
#include<iostream>
int main(){
std::cout << getenv("_") << '\n';
return 0;
}
компиляции
$ c++ a.cpp -o a.out
$ ./a.out
печатает ./a.out
(или что-то другое – это выполненная строка, включая путь).
Это имеет определенные преимущества по сравнению с другими подходами, его можно читать глобально (не передавать argv[0]
) и не требует обработки файлов.