Как программно получить GID рабочего процесса

К сожалению, это очень зависит от того, каково Ваше приложение. Существует несколько способов, которыми приложение может мерцать корневой каталог пользователя.

  1. $HOME

    Вы уже знаете об этом. $HOME переменная среды, которая может быть переопределена через конфигурацию входа в систему. файлы такой как .bashrc или .bash_profile в среде Bash. Значение обычно - что-то как /home/username.

  2. /home/$USER

    Я считал бы это вариантом $HOME, но я встретился с приложениями, которые по-дурацки предполагают, что корневой каталог пользователя должен быть под /home, таким образом, они лавируют на переменной $USER и используйте это.

  3. парсинг /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.

  4. GTK И g_get_home_dir()

    Библиотека GTK обеспечивает API, g_get_home_dir() который вытянет информацию о пользователе от "passwd" бэкенда, а не использования $HOME.

    выборка из Бойкого Справочника

    Обратите внимание, что в отличие от традиционных инструментов Unix, эта функция предпочитает passwd записи по переменной Домашней среды.

  5. KDE

    KDE, кажется, использует $HOME. Это будет сначала искать KDEHOME , отступание к $HOME/.kde если это не установлено.

    выборка Системное администрирование KDE/KDE Иерархия Файловой системы

    Это дерево каталогов, как имя предполагает, обычно расположенный в корневом каталоге пользователя. Если эта переменная среды не определяется, $HOME/.kde4 местоположения по умолчанию используется.

5
03.07.2014, 12:27
2 ответа

Похоже, это очень популярный вопрос, поэтому я хочу, чтобы ответ был предельно ясным. @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).

Спасибо, Марк!

1
27.01.2020, 20:42

Я не знаю никакого портативного способа сделать это. Я думал, может быть, ptrace(), но я не могу понять, как из manpage. Даже если это сработает, "отслеживание" другого процесса любым способом, вероятно, является излишне инвазивным

Для Linux, ваше предложение использовать fopen("/proc/PID/status", "r") является примерно таким же чистым и прямым, как вы собираетесь получить. Похоже на то, что делает gdb.

2
27.01.2020, 20:42

Теги

Похожие вопросы