В линукс С++ как узнать текущего процесса каталог
Ничего не понял. Мб fuser?
То есть задачка на самом деле такая, есть программа, в той же папке что лежит программа лежит файл '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.
Если может в линуксе такой подход устарел то выслушаю любую критику
может быть что-то можно найти в /proc/your_pid погляди там. хотя не факт
То есть задачка на самом деле такая, есть программа, в той же папке что лежит программа лежит файл 'config.cfg' надо из программы узнать полоный путь к файлу config.cfg чтобы его открыть и прочитать конфигурацию.А если воспользоваться аргументами функции main? Там вроде argc[0] это имя программы вместе с путем к ней.
В линукс С++ как узнать текущего процесса каталогЭтого сделать нельзя.
Этого сделать нельзя
Можно.
Если может в линуксе такой подход устарел то выслушаю любую критикуМожно в
/etc/<name of program>/
положить или в
$HOME/.<name of program>/
Можно.Как?
Но класть туда конфиг - не лучшая идея.
но там не абсолютный путь
если chdir не делалось
то realpath поможет найти абсолютный
делать конфиг там, где работает автоопределение - очень плохая идея
А что за автоопределение ?
если пренебречь вариациями на тему chroot и soft-link
mozilla, openoffice, java sdk
#!/usr/bin/python
import os
os.spawnlp(os.P_WAIT, './1', '---')
При этом /proc/.../exe по прежнему верный.
про автоопределение - херню написал, тред не внимательно прочитал
int execve(const char *filename, char *const argv[], char *const envp[]);
Здесь можно поставить argv[0] != filename, и его передадут без изменений вызываемой программе.
/proc/<pid>/exeДа. Я был не прав. Я исходил из
Но класть туда конфиг - не лучшая идея.
http://www.faqs.org/faqs/unix-faq/programmer/faq/
1.14 How can I find a process' executable file?
Но в linux, оказывается, можно.
http://www.faqs.org/faqs/unix-faq/programmer/faq/, спасибо за ссылку кстати
Не могу сказать что концепция каталог должен содержать только executable и ничего кроме, меня удовлетворяет, такой уж я виндузятник в душе Буду юзать argv[0]
всем спасибо
Почитал Не могу сказать что концепция каталог должен содержать только executable и ничего кроме, меня удовлетворяет, такой уж я виндузятник в душе Буду юзать argv[0]
всем спасибо
В порядке возрастания приоритета примерно таких.
1. Встроенная конфигурация. Лежит где-нибудь типа /usr/share или вообще встроена в бинарник.
2. Глобальные настройки. Где-то в /etc.
3. Пользовательские настройки (если программа запускается пользователем). Где-то в $HOME, имя конфига начинается с точки.
4. Сеансовые настройки. В переменных окружения.
5. Настройки, специфичные для процесса. В параметрах командной строки.
6. Специфичные для проекта настройки (для всяких редакторов). В текущей директории, или в той, где файлы с данными.
Если настройки привязываются к бинарнику - это что-то типа пункта 1.
Использование argv[0] наблюдается в говнософте, который типа переносимый, но большая часть пользователей в винде, соответственно разработчики ориентируются на винду, а другие платформы поддерживают по остаточному принципу. Говнософт, потому что в винде они не особо нужны, а на других платформах просто хреново работают.
Забыл. Если программа графическая, то есть ещё настройки дисплея.
Насколько я знаю, у них это и узнаётся.
ох, перепутал кнопку
Оставить комментарий
vertyal17
getcwd возвращает как оказалось не всегда то что нужночем следует пользоваться?
заранее спасибо !
зы/ поискал в унистд, может плохо но кроме getcwd и getwd не нашел других подходящих функций, а эти не совсем корректные