Scroll to navigation

CREDENTIALS(7) Руководство программиста Linux CREDENTIALS(7)

ИМЯ

credentials - идентификаторы процесса

ОПИСАНИЕ

ID (PID) процесса

Каждый процесс имеет уникальный неотрицательный целочисленный идентификатор (PID), который ему назначается при создании с помощью fork(2). Процесс может узнать свой PID с помощью вызова getpid(2). PID имеет тип pid_t (определён в <sys/types.h>).

PID используется в различных системных вызовах для указания процесса, с которым работает вызов, например: kill(2), ptrace(2), setpriority(2) setpgid(2), setsid(2), sigqueue(3) и waitpid(2).

PID процесса сохраняется после execve(2).

Родительский ID (PPID) процесса

ID родительского процесса — это ID процесса, который создал данный процесс с помощью fork(2). Процесс может получить свой PPID с помощью getppid(2). PPID имеет тип pid_t.

PPID процесса сохраняется после execve(2).

ID группы процессов и сеанса

У каждого процесса есть ID сеанса и ID группы процессов; они имеют тип pid_t. Процесс может получить ID своего сеанса с помощью getsid(2), а ID своей группы процессов с помощью getpgrp(2).

Потомок, создаваемый с помощью fork(2), наследует ID сеанса и группы процессов своего родителя. Идентификатор сеанса и группы сохраняется после execve(2).

Сеансы и группы процессов — это абстракции, предназначенные для поддержки управления заданиями оболочки. Группа процессов (иногда называемая «заданием» (job)) — это набор процессов, у которых одинаковый ID группы процессов; оболочка создаёт новую группу процессов для процессов, используемых в одной команде или конвейере (например, два процесса, созданные командой «ls | wc», помещаются в одну группу процессов). Членство в группе процессов может быть определено с помощью setpgid(2). Процесс, чей ID процесса совпадает с его ID группы процессов, называется лидером группы процессов этой группы.

Сеанс — это набор процессов, у которых одинаковый ID сеанса. Все члены группы процессов также имеют одинаковый ID сеанса (т. е., все члены группы процессов всегда принадлежат одному сеансу; таким образом, сеансы и группы процессов формируют из процессов жёсткую двухуровневую иерархию). Новый сеанс создаётся при вызове процессом setsid(2), который создаёт новый сеанс, чей ID сеанса совпадает с PID процесса, который вызвал setsid(2). Создатель сеанса также называется лидером сеанса.

Все процессы в сеансе используют общий управляющий терминал. Управляющий терминал назначается в момент, когда лидер сеанса впервые открывает терминал (если при вызове open(2) не указан флаг O_NOCTTY). Терминал может быть управляющим терминалом не более чем для одного сеанса.

В сеансе может быть только одно активное задание (foreground job); все остальные задания в сеансе считаются фоновыми заданиями (background jobs). Только активное задание может читать данные из терминала; когда процесс в фоне пытается прочитать данные с терминала, его группе процессов посылается сигнал SIGTTIN, который приостанавливает (suspends) задание. Если у терминала установлен флаг TOSTOP (смотрите termios(3)), то только активное задание может писать в терминал; попытка записи из фонового задания приводит к генерации сигнала SIGTTOU, который приостанавливает задание. Если нажимаются клавиши терминала, которые генерируют сигнал (например клавиша interrupt, обычно это комбинация control-C), то сигнал посылается процессам в активном задании.

С членами группы процессов могут работать различные системные вызовы и библиотечные функции, такие как: kill(2), killpg(3), getpriority(2), setpriority(2), ioprio_get(2), ioprio_set(2), waitid(2) и waitpid(2). Также смотрите описание операций F_GETOWN, F_GETOWN_EX, F_SETOWN и F_SETOWN_EX в fcntl(2).

Идентификаторы пользователя и группы

С каждым процессом связаны идентификатор пользователя и различных групп. Эти идентификаторы представляются в виде целых чисел с типами gid_t и uid_t, соответственно (определены в <sys/types.h>).

В Linux каждый процесс имеет следующие идентификаторы пользователя и групп:

  • Реальный ID пользователя (real user) и реальный ID группы. Эти ID определяют кто владелец процесса. Реальный ID пользователя (группы) процесса можно получить с помощью getuid(2) (getgid(2)).
  • Эффективный ID пользователя (effective user) и эффективный ID группы. Эти ID используются ядром для определения прав, которые будет иметь процесс при доступе к общим ресурсам, таким как очереди сообщений, общая память и семафоры. В большинстве систем UNIX эти ID также определяют права доступа к файлам. Однако в Linux для этой задачи используются ID файловой системы, описанные далее. Эффективный ID пользователя (группы) процесса можно получить с помощью geteuid(2) (getegid(2)).
  • Сохранённые set-user-ID и set-group-ID. Эти ID используются в программах с set-user-ID и set-group-ID битами для сохранения копии соответствующих эффективных ID, которые были установлены в момент запуска программы (смотрите execve(2)). Программа с set-user-ID может повышать и понижать права, переключая свой ID эффективного пользователя туда и обратно между значениями её ID реального пользователя и сохранённым set-user-ID. Такое переключение производится с помощью вызовов seteuid(2), setreuid(2) или setresuid(2). Программа с set-group-ID выполняет аналогичные задачи с помощью setegid(2), setregid(2) или setresgid(2). Сохранённый set-user-ID (set-group-ID) процесса можно получить с помощью getresuid(2) (getresgid(2)).
  • ID пользователя файловой системы и ID группы файловой системы (есть только в Linux). Эти ID, совместно с ID дополнительных групп (supplementary group), описанных ниже, используются для определения прав доступа к файлам; подробней смотрите path_resolution(7). Каждый раз при изменении ID эффективного пользователя (группы) ядро также автоматически изменяет ID пользователя (группы) файловой системы на то же значение. Следовательно, ID файловой системы, обычно, равны соответствующим эффективным ID, а семантика проверки прав доступа к файлам в Linux такая же как и у других систем UNIX. ID файловой системы можно сделать отличным от эффективных ID с помощью вызова setfsuid(2) и setfsgid(2).
  • Supplementary group IDs. This is a set of additional group IDs that are used for permission checks when accessing files and other shared resources. On Linux kernels before 2.6.4, a process can be a member of up to 32 supplementary groups; since kernel 2.6.4, a process can be a member of up to 65536 supplementary groups. The call sysconf(_SC_NGROUPS_MAX) can be used to determine the number of supplementary groups of which a process may be a member. A process can obtain its set of supplementary group IDs using getgroups(2).

Дочерний процесс, созданный fork(2), наследует копии ID пользователя и группы своего предка. При execve(2) сохраняются ID реального пользователя и группы процесса, а также ID дополнительных групп; эффективный и сохранённый ID могут измениться (описано в execve(2)).

Кроме целей, отмеченных выше, идентификаторы пользователя процесса также используются:

  • при определении права на отправку сигналов (смотрите kill(2));
  • при определении права на установку параметров планировщика процесса (значение уступчивости, политика и приоритет планирования в реальном времени, увязывание ЦП, приоритет ввода-вывода) с помощью setpriority(2), sched_setaffinity(2), sched_setscheduler(2), sched_setparam(2), sched_setattr(2) и ioprio_set(2);
  • при проверке ограничения по ресурсам (смотрите getrlimit(2));
  • при проверке ограничения на количество экземпляров inotify, которые процесс может создать (смотрите inotify(7)).

Modifying process user and group IDs

Subject to rules described in the relevant manual pages, a process can use the following APIs to modify its user and group IDs:

setuid(2) (setgid(2))
Modify the process's real (and possibly effective and saved-set) user (group) IDs.
seteuid(2) (setegid(2))
Modify the process's effective user (group) ID.
setfsuid(2) (setfsgid(2))
Modify the process's filesystem user (group) ID.
setreuid(2) (setregid(2))
Modify the process's real and effective (and possibly saved-set) user (group) IDs.
setresuid(2) (setresgid(2))
Modify the process's real, effective, and saved-set user (group) IDs.
setgroups(2)
Modify the process's supplementary group list.

Any changes to a process's effective user (group) ID are automatically carried over to the process's filesystem user (group) ID. Changes to a process's effective user or group ID can also affect the process "dumpable" attribute, as described in prctl(2).

Changes to process user and group IDs can affect the capabilities of the process, as described in capabilities(7).

СООТВЕТСТВИЕ СТАНДАРТАМ

ID процесса, ID родительского процесса, ID группы процессов и ID сеанса определены в POSIX.1. ID реального, эффективного и сохранённого пользователя и группы, а также ID дополнительных групп определены в POSIX.1. ID пользователя и группы файловой системы являются расширением Linux.

ЗАМЕЧАНИЯ

Различные поля в файле /proc/[pid]/status отражают идентификаторы процесса, описанные выше. Подробности смотрите в proc(5).

Согласно спецификации на нити POSIX требуется, чтобы идентификаторы были одинаковыми у всех нитей процесса. Однако на уровне ядра в Linux ведутся отдельные идентификаторы пользователя и группы для каждой нити. Реализация нитей NPTL выполняет дополнительные действия, чтобы любое изменение идентификаторов пользователя и группы (например, с помощью setuid(2), setresuid(2)) отражалось на всех нитях POSIX процесса. Дополнительную информацию смотрите в nptl(7).

СМ. ТАКЖЕ

bash(1), csh(1), groups(1), id(1), newgrp(1), ps(1), runuser(1), setpriv(1), sg(1), su(1), access(2), execve(2), faccessat(2), fork(2), getgroups(2), getpgrp(2), getpid(2), getppid(2), getsid(2), kill(2), setegid(2), seteuid(2), setfsgid(2), setfsuid(2), setgid(2), setgroups(2), setpgid(2), setresgid(2), setresuid(2), setsid(2), setuid(2), waitpid(2), euidaccess(3), initgroups(3), killpg(3), tcgetpgrp(3), tcgetsid(3), tcsetpgrp(3), group(5), passwd(5), shadow(5), capabilities(7), namespaces(7), path_resolution(7), pid_namespaces(7), pthreads(7), signal(7), system_data_types(7), unix(7), user_namespaces(7), sudo(8)

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Katrin Kutepova <blackkatelv@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

1 ноября 2020 г. Linux