C, открывать файлы относительно пути к исполняемому файлу?

Я хочу исправить старую программу C (получил исходный код), которая использует относительные пути для загрузки файлов данных, ожидая, что исполняемый файл вызывается из каталога, в котором он находится, например LoadEx("./dataFile", dataFile); Конечно, вызов программы из другого каталога невозможен, поскольку dataFile не может быть загружен.

Как я могу изменить программу C для загрузки dataFiles относительно каталога исполняемого файла?

EDIT: Мой первоначальный вопрос оказался неприменимым, и поэтому он дублируется по крайней мере: - Как найти местоположение исполняемого файла в C? - Как открыть файл с его относительным путем в Linux? - Поиск текущего пути к исполняемому файлу без /proc/self/exe


person juanmirocks    schedule 04.02.2012    source источник
comment
Перечисленный вами метод Java не читает ресурсы относительно исполняемого класса Java, а скорее относительно его пути к классам.   -  person Perception    schedule 04.02.2012
comment
Вы совершенно правы. Я неправильно понял, как работает ClassLoader в Java. Таким образом, мой первоначальный вопрос становится неприменимым... Тогда я думаю, что нет другого пути, кроме как найти абсолютный путь с помощью proc или установить абсолютный путь через конфигурацию, и в этом случае мой вопрос становится дубликатом другого.   -  person juanmirocks    schedule 04.02.2012
comment
Параметр argv[0] основной функции в коде C должен содержать полное имя файла и путь к исполняемому файлу. Предполагая, что у вас есть основная функция и вы не стерли свои аргументы.   -  person JimR    schedule 04.02.2012


Ответы (1)


Почему ты не хочешь readlink("/proc/self/exe")? Именно так можно найти путь к исполняемому файлу в Linux.

Единственный другой способ — извлечь PATH из среды с помощью getenv() и просмотреть каталоги PATH в поисках совпадения с argv[0]. Первый вариант гораздо проще.

Или напишите скрипт для запуска программы после первого выполнения which в исполняемом файле и передачи результата в качестве аргумента командной строки или какого-нибудь подобного хака.

person Duck    schedule 04.02.2012
comment
Спасибо Дак. Думаю, я нахожу это довольно уродливым, когда приходится зависеть от стольких деталей конкретной ОС вместо того, чтобы использовать более стандартное решение. Если бы я хотел запустить его на других операционных системах, мне пришлось бы проверить proc или argv[0] или $PATH или GetModuleFileName, как в stackoverflow.com/questions/933850/ Но, вероятно, это так, как это делается? - person juanmirocks; 04.02.2012
comment
файловые системы зависят от ОС. Не во всех ОС даже есть файловые системы! - person ObscureRobot; 04.02.2012
comment
Что поделаешь, это несовершенный мир. Если это облегчает принятие, это, вероятно, то, что Java делает и под прикрытием. - person Duck; 04.02.2012
comment
@ObscureRobot конечно, но, на мой взгляд, язык мог бы легко предоставить для этого библиотеку для стандартных ОС - person juanmirocks; 04.02.2012
comment
Язык C был разработан для реализации ОС, поэтому сама идея стандартной ОС бессмысленна. Керниган и Ритчи никогда не ожидали, что Unix станет настолько популярной, как это произошло (как и Линус, когда начинал с Linux). - person ObscureRobot; 04.02.2012