LINUX.ORG.RU

Получить путь к исполняемому файлу в си

 


0

1

Ситуация. В /opt/dir лежит a.exe с +х. Создали ln -s /opt/dir/a.exe ~/progs/a.exe

Как в a.exe определить директорию в которой он лежит по-настоящему, чтобы получить доступ к файлам, которые рядом с ним? Или так нельзя/не делают?

★★

Последнее исправление: cetjs2 (всего исправлений: 1)
Ответ на: комментарий от t184256

Т.е. Если у меня что-то стоит в /opt и я создаю мягкую ссылку в хомяк и программа перестает видеть ресурсы - это нормальное поведение?

sambist ★★
() автор топика
Ответ на: комментарий от sambist

Если у меня что-то стоит в /opt

A package to be installed in /opt must locate its static files in a separate /opt/<package> or /opt/<provider> directory tree, where <package> is a name that describes the software package and <provider> is the provider's LANANA registered name. (источник: FHS 3.0)

t184256 ★★★★★
()
Ответ на: комментарий от sambist

Т.е. Если у меня что-то стоит в /opt и я создаю мягкую ссылку в хомяк и программа перестает видеть ресурсы - это нормальное поведение?

зачем ты делаешь символьную ссылку? (вот в этом и есть твоя ошибка! не надо делать куда-не-попадя-символьные-ссылки!!!)

делай sh-файл, внутри которого shell-инструкция exec , а не символьную ссылку

ну а вообще — если хочешь поизвращяться — то используй внутри своей программы (рекурсивно) readlink для аргрумента argv[0] .. в конечном итоге дойдёшь до настоящего файла

user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 5)
Ответ на: комментарий от sambist

Ты бы хоть прочитал то, что я написал... Ладно, я сегодня добрый, переведу.

Если программа a.exe лежит по пути /opt/blackduck/a.exe, то к требуемому ей для работы файлу quack.pack, поставляющемуся с ней в комплекте, она обязана обращаться по пути /opt/blackduck/quack.pack или /opt/blackduck/.../quack.pack. Просто, понятно и логично.

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от user_id_68054

зачем ты делаешь символьную ссылку? (вот в этом и есть твоя ошибка! не надо делать куда-не-попадя-символьные-ссылки!!!)

Нет, его ошибка — в нарушении FHS.

делай sh-файл, внутри которого shell-инструкция exec , а не символьную ссылку

Вы хотели сказать «а на него — символьную ссылку»? Сработает, но костыль же.

t184256 ★★★★★
()
Ответ на: комментарий от user_id_68054

внутри своей программы (рекурсивно) readlink для аргрумента argv[0] .. в конечном итоге дойдёшь до настоящего файла

Вместо этого проще один раз realpath вызвать.

xaizek ★★★★★
()
Ответ на: комментарий от sambist

Если у меня что-то стоит в /opt и я создаю мягкую ссылку

Гм... Я вот с утра видел, какой-то бомж создавал мягкую ссылку около своей помойки. Теперь видимо ссылается на это, чтобы доказать, что помойка — его.

kirk_johnson ★☆
()

симлинк - не ярлык в шинде. аналог ярлыка - .desktop или, как уже было сказано выше, шелл-скрипт.

anonymous
()
Ответ на: комментарий от anonymous

Помогите, readlink не работает!

У меня в argv[0] обычно оказывается имя команды, а иногда там вообще какие-то ругательства пишут, что мне делать?!

staseg ★★★★★
()

Как в a.exe определить директорию в которой он лежит по-настоящему

Зачем это нужно?

true_admin ★★★★★
()

В /proc/<твой PID>/ (или /proc/self/) лежит 'exe' - симв. ссылка на реальный путь к бинарнику.

ABW ★★★★★
()
Ответ на: комментарий от t184256

Вы хотели сказать «а на него — символьную ссылку»? Сработает, но костыль же.

нее.. я хотел сказать что вообще не надо делать символьные ссылки на исполняемые файлы.

есть действительно несколько ситуаций, при которых позволяется делать символьные ссылки (обычно работа с данными).. в остальных же ситуациях — символьные ссылки всё портят.

user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 1)
Ответ на: комментарий от xaizek

> внутри своей программы (рекурсивно) readlink для аргрумента argv[0] .. в конечном итоге дойдёшь до настоящего файла

Вместо этого проще один раз realpath вызвать.

да, спасибо за уточнение\просветление! :-)

user_id_68054 ★★★★★
()
Ответ на: комментарий от t184256

в его случае - это, безусловно, говнокод

Deleted
()
Ответ на: комментарий от ABW

Если бинарник упакован upx,например, то реального пути там нет. Подозреваю, что еще есть подобные исключения.

ilovewindows ★★★★★
()
Ответ на: комментарий от ABW

В /proc/<твой PID>/ (или /proc/self/) лежит 'exe' - симв. ссылка на реальный путь к бинарнику.

Но надо заметить что это ни разу не непортабельно.

slovazap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.