В линукс С++ как узнать текущего процесса каталог
Ничего не понял. Мб fuser?
нужен аналог виндового 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.
Если может в линуксе такой подход устарел то выслушаю любую критику
То есть задачка на самом деле такая, есть программа, в той же папке что лежит программа лежит файл '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>/
Можно.Как?
/proc/<pid>/exe
Но класть туда конфиг - не лучшая идея.
Но класть туда конфиг - не лучшая идея.
argv[0]
но там не абсолютный путь
если chdir не делалось
то realpath поможет найти абсолютный
но там не абсолютный путь
если chdir не делалось
то realpath поможет найти абсолютный
делать конфиг там, где работает автоопределение - очень плохая идея
argv[0] имеет довольно слабое отношение к исполняемому бинарнику. Это всего лишь строка, которую передали при exec.
А что за автоопределение ?
А что за автоопределение ?
разве эта строка, в случае если запускается бинарник, а не скрипт, не является путём к исполняемому бинарнику?
если пренебречь вариациями на тему chroot и soft-link
если пренебречь вариациями на тему chroot и soft-link
Обычно в таком говнософте заставляют запускать не бинарник, а скрипт-враппер, который с помощью $0 и прочей нехитрой магии узнаёт пути ко всем "конфигам", а так же "разделяемым библиотекам".
mozilla, openoffice, java sdk
mozilla, openoffice, java sdk
Нет, попробуй:
При этом /proc/.../exe по прежнему верный.
#!/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] наблюдается в говнософте, который типа переносимый, но большая часть пользователей в винде, соответственно разработчики ориентируются на винду, а другие платформы поддерживают по остаточному принципу. Говнософт, потому что в винде они не особо нужны, а на других платформах просто хреново работают.
В порядке возрастания приоритета примерно таких.
1. Встроенная конфигурация. Лежит где-нибудь типа /usr/share или вообще встроена в бинарник.
2. Глобальные настройки. Где-то в /etc.
3. Пользовательские настройки (если программа запускается пользователем). Где-то в $HOME, имя конфига начинается с точки.
4. Сеансовые настройки. В переменных окружения.
5. Настройки, специфичные для процесса. В параметрах командной строки.
6. Специфичные для проекта настройки (для всяких редакторов). В текущей директории, или в той, где файлы с данными.
Если настройки привязываются к бинарнику - это что-то типа пункта 1.
Использование argv[0] наблюдается в говнософте, который типа переносимый, но большая часть пользователей в винде, соответственно разработчики ориентируются на винду, а другие платформы поддерживают по остаточному принципу. Говнософт, потому что в винде они не особо нужны, а на других платформах просто хреново работают.
Забыл. Если программа графическая, то есть ещё настройки дисплея.
Насколько я знаю, у них это и узнаётся.
ох, перепутал кнопку
Оставить комментарий
vertyal17
getcwd возвращает как оказалось не всегда то что нужночем следует пользоваться?
заранее спасибо !
зы/ поискал в унистд, может плохо но кроме getcwd и getwd не нашел других подходящих функций, а эти не совсем корректные