К сожалению, это очень зависит от того, каково Ваше приложение. Существует несколько способов, которыми приложение может мерцать корневой каталог пользователя.
$HOME
Вы уже знаете об этом. $HOME
переменная среды, которая может быть переопределена через конфигурацию входа в систему. файлы такой как .bashrc
или .bash_profile
в среде Bash. Значение обычно - что-то как /home/username
.
/home/$USER
Я считал бы это вариантом $HOME
, но я встретился с приложениями, которые по-дурацки предполагают, что корневой каталог пользователя должен быть под /home
, таким образом, они лавируют на переменной $USER
и используйте это.
парсинг /etc/passwd
Это - вероятно, худший преступник с точки зрения худшего способа получить корневой каталог пользователя, но много инструментов и сценариев делает это этот путь. Большинство из них является различием чего-то вроде этого, где они используют getent
команда:
$ getent passwd | grep $1 | awk -F: '{ print $6 }'
# for example (user "saml")
$ getent passwd | grep saml | awk -F: '{ print $6 }'
/home/saml
Бэкенд "база данных", которая хранит информацию пользователя, может быть чем-либо от /etc/passwd
файл, к NIS, к базе данных LDAP.
GTK И g_get_home_dir()
Библиотека GTK обеспечивает API, g_get_home_dir()
который вытянет информацию о пользователе от "passwd" бэкенда, а не использования $HOME
.
выборка из Бойкого Справочника
Обратите внимание, что в отличие от традиционных инструментов Unix, эта функция предпочитает passwd записи по переменной Домашней среды.
KDE
KDE, кажется, использует $HOME. Это будет сначала искать KDEHOME
, отступание к $HOME/.kde
если это не установлено.
выборка Системное администрирование KDE/KDE Иерархия Файловой системы
Это дерево каталогов, как имя предполагает, обычно расположенный в корневом каталоге пользователя. Если эта переменная среды не определяется, $HOME/.kde4 местоположения по умолчанию используется.
Похоже, это очень популярный вопрос, поэтому я хочу, чтобы ответ был предельно ясным. @MarkPlotnick дал лучший ответ в качестве комментария к предыдущему (довольно хорошему )ответу, но мы не привлекли его внимание, чтобы опубликовать его, чтобы я мог принять его как правильный ответ и помочь людям. Итак, с извинениями перед Марком:
Mark Plotnick says: You can also do stat("/proc/nnn", &stb); the process's effective gid will be in stb.st_gid. This is simultaneously more portable (it works on Linux and FreeBSD) and less portable (it's not documented).
Спасибо, Марк!
Я не знаю никакого портативного способа сделать это. Я думал, может быть, ptrace()
, но я не могу понять, как из manpage. Даже если это сработает, "отслеживание" другого процесса любым способом, вероятно, является излишне инвазивным
Для Linux, ваше предложение использовать fopen("/proc/PID/status", "r")
является примерно таким же чистым и прямым, как вы собираетесь получить. Похоже на то, что делает gdb.