Как мне получить каталог исполняемой программы на C, используя платформо-независимый метод? - PullRequest
3 голосов
/ 11 июня 2010

Я разрабатываю свое приложение для Linux как для Unix, так и для Win32 (кросс-компиляция при каждой сборке) платформ, так что готовая функция была бы хороша :). Я использую glib с функцией gchar* g_get_current_dir(void), которая возвращает текущий каталог, но мне действительно нужен каталог исполняемого файла. Я неопытный в программировании на C, поэтому любые предложения приветствуются.

Ответы [ 3 ]

1 голос
/ 11 июня 2010

В Unix-подобных операционных системах, имеющих каталог /proc, вы можете readlink /proc/self/exe получить полный путь к действительным исполняемым файлам, даже если у argv[0] этого нет.

Возможно, это не такработать, однако, если исполняемый файл был запущен с fexecv (недоступно во многих системах) и если это реализовано как системный вызов в вашей системе.fexecv аналогично execve за исключением того, что ему передается открытый дескриптор файла, а не имя файла для запуска.В Linux это реализуется путем вызова execve для строки, сгенерированной `" / proc / self /% i ", fd", поэтому файл должен будет находиться в файловой системе во время запуска программы.

Я думаю, что GNU / Hurd изначально поддерживает fexecve.

Возможно, что исполняемый файл может быть переименован или удален из файловой системы после того, как он был выполнен, что делает его безымянным файлом, которыйисчезнет, ​​как только он перестанет быть открытым (в этом контексте для запуска файла обычно требуется, чтобы он был открыт ядром).

1 голос
/ 11 июня 2010

GetModuleFileName в Windows. argv [0] в linux

ПРИМЕЧАНИЕ: Если вы занимаетесь кроссплатформенным программированием, вам следует использовать также некоторые кроссплатформенные библиотеки, скрывающие этот слой (Qt, wxWidgets,ЭЙС, Boost [Не знаю, но я думаю, что у него есть что-то] ...)

0 голосов
/ 11 июня 2010

Я не могу говорить с окнами.Однако в UNIX довольно много времени это возможно, но это не гарантировано.Причины этого включают в себя вызовы exec из других программ, таких как shell, которые в некоторых случаях могут помутать, где находится исполняемый файл, например, относительный путь, например "../../../mybin/exe/myprogram"Переменная PATH также делает интересным отслеживание исполняемого файла.

Позвольте мне спросить: что вы пытаетесь сделать, или, вернее, зачем вам знать?ИМО тебе не нужно знать.Вы можете проверить getcwd (), и если вы не работаете в каталоге, который работает, выйдите.Не должно иметь значения, где находится ваш исполняемый образ.

Вот один кусок кода, который работает большую часть времени, а не всегда!

требует вызова main, используя argv [0], яЯ использую вызовы popen () для shell, чтобы сделать код вписывающимся в небольшой код, popen () не всегда является хорошим выбором, это может не сработать, если в PATH ранее есть другие исполняемые файлы с таким же именем:*

...