В линукс С++ как узнать текущего процесса каталог

vertyal17

getcwd возвращает как оказалось не всегда то что нужно
чем следует пользоваться?
заранее спасибо !
зы/ поискал в унистд, может плохо но кроме getcwd и getwd не нашел других подходящих функций, а эти не совсем корректные

Olenenok

Ничего не понял. Мб fuser?

vertyal17

нужен аналог виндового GetModuleFilename, то есть полный путь к исполняемому файлу, который какбы представляет процесс.
То есть задачка на самом деле такая, есть программа, в той же папке что лежит программа лежит файл 'config.cfg' надо из программы узнать полоный путь к файлу config.cfg чтобы его открыть и прочитать конфигурацию.
Просто открывать fopen("config.cfg") вроде как нехорошо, потому что он начнет открывать файл лежащий в текущем каталоге, который не обязательно совпадает с каталогом в котором сама программа лежит.
Например в эклипсе когда запускаю свою прогу, текущий каталог у нее
\home\misha\proga
а сама программа и ее config.cfg лежит на самом деле не в текущем каталоге, а в
\home\misha\proga\release\proga.out
\home\misha\proga\release\config.cfg
ps.
Если может в линуксе такой подход устарел то выслушаю любую критику

skyformstd

может быть что-то можно найти в /proc/your_pid погляди там. хотя не факт

Elina74

То есть задачка на самом деле такая, есть программа, в той же папке что лежит программа лежит файл 'config.cfg' надо из программы узнать полоный путь к файлу config.cfg чтобы его открыть и прочитать конфигурацию.
А если воспользоваться аргументами функции main? Там вроде argc[0] это имя программы вместе с путем к ней.

Vladu

В линукс С++ как узнать текущего процесса каталог
Этого сделать нельзя.

ppplva

Этого сделать нельзя

Можно.

Vladu

Если может в линуксе такой подход устарел то выслушаю любую критику
Можно в
/etc/<name of program>/

положить или в
$HOME/.<name of program>/

Vladu

Можно.
Как?

ppplva

/proc/<pid>/exe
Но класть туда конфиг - не лучшая идея.

oleg_n

argv[0]
но там не абсолютный путь
если chdir не делалось
то realpath поможет найти абсолютный

oleg_n

делать конфиг там, где работает автоопределение - очень плохая идея

ppplva

argv[0] имеет довольно слабое отношение к исполняемому бинарнику. Это всего лишь строка, которую передали при exec.
А что за автоопределение ?

oleg_n

разве эта строка, в случае если запускается бинарник, а не скрипт, не является путём к исполняемому бинарнику?
если пренебречь вариациями на тему chroot и soft-link

Marinavo_0507

Обычно в таком говнософте заставляют запускать не бинарник, а скрипт-враппер, который с помощью $0 и прочей нехитрой магии узнаёт пути ко всем "конфигам", а так же "разделяемым библиотекам".
mozilla, openoffice, java sdk

ppplva

Нет, попробуй:
#!/usr/bin/python
import os
os.spawnlp(os.P_WAIT, './1', '---')

При этом /proc/.../exe по прежнему верный.

oleg_n

не понял, поясни
про автоопределение - херню написал, тред не внимательно прочитал

ppplva

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

Здесь можно поставить argv[0] != filename, и его передадут без изменений вызываемой программе.

Vladu

/proc/<pid>/exe
Но класть туда конфиг - не лучшая идея.
Да. Я был не прав. Я исходил из
http://www.faqs.org/faqs/unix-faq/programmer/faq/
1.14 How can I find a process' executable file?
Но в linux, оказывается, можно.

vertyal17

Почитал http://www.faqs.org/faqs/unix-faq/programmer/faq/, спасибо за ссылку кстати
Не могу сказать что концепция каталог должен содержать только executable и ничего кроме, меня удовлетворяет, такой уж я виндузятник в душе Буду юзать argv[0]
всем спасибо

Marinavo_0507

Хорошие программы имеют несколько уровней конфигурации (если, конечно, нуждаются в таковой).
В порядке возрастания приоритета примерно таких.
1. Встроенная конфигурация. Лежит где-нибудь типа /usr/share или вообще встроена в бинарник.
2. Глобальные настройки. Где-то в /etc.
3. Пользовательские настройки (если программа запускается пользователем). Где-то в $HOME, имя конфига начинается с точки.
4. Сеансовые настройки. В переменных окружения.
5. Настройки, специфичные для процесса. В параметрах командной строки.
6. Специфичные для проекта настройки (для всяких редакторов). В текущей директории, или в той, где файлы с данными.
Если настройки привязываются к бинарнику - это что-то типа пункта 1.
Использование argv[0] наблюдается в говнософте, который типа переносимый, но большая часть пользователей в винде, соответственно разработчики ориентируются на винду, а другие платформы поддерживают по остаточному принципу. Говнософт, потому что в винде они не особо нужны, а на других платформах просто хреново работают.

Marinavo_0507

Забыл. Если программа графическая, то есть ещё настройки дисплея.

Ivan8209

Насколько я знаю, у них это и узнаётся.

Marinavo_0507

ох, перепутал кнопку
Оставить комментарий
Имя или ник:
Комментарий: