CREDENTIALS(7) | Linux Programmer's Manual | CREDENTIALS(7) |
credentials - 認証に用いられるプロセスの識別子
各プロセスは、負でない整数の一意な識別子を持つ。 この識別子は fork(2) を使ってプロセスが生成される際に割り当てられる。 プロセスは getpid(2) を使って自分の PID を取得できる。 PID は pid_t 型で表現される (pid_t は <sys/types.h> で定義されている)。
PID は各種のシステムコールでそのシステムコールが作用するプロセスを 特定するために使用される。以下に例を挙げる: kill(2), ptrace(2), setpriority(2), setpgid(2), setsid(2), sigqueue(3), waitpid(2).
プロセスの PID は execve(2) の前後で不変である。
プロセスの親プロセスの ID は、 fork(2) を使ってそのプロセスを生成したプロセスを示す。 プロセスは getppid(2) を使って自分の PPID を取得できる。 PPID は pid_t 型で表現される。
プロセスの PPID は execve(2) の前後で不変である。
各プロセスはセッション ID とプロセスグループ ID を持つ。 これらの ID はどちらも pid_t 型で表現される。 プロセスは、それぞれ getsid(2), getpgrp(2) を使って自分のセッション ID、プロセスグループ ID を取得できる。
fork(2) で生成された子プロセスは親プロセスのセッション ID とプロセスグループ ID を継承する。プロセスのセッション ID とプロセスグループ ID は execve(2) の前後で不変である。
セッションとプロセスグループの概念は、シェルのジョブ制御を行うために 考案されたものである。 プロセスグループ (時には「ジョブ」と呼ばれることもある) は、 同じプロセスグループ ID を共有するプロセスの集まりである。 シェルは、一つのコマンドもしくはパイプラインの実行に使われるプロセス群に 対して一つのプロセスグループを生成する (例えば、コマンド "ls | wc" を実行するために生成される二つのプロセスは 同じプロセスグループに置かれる)。 所属するプロセスグループは setpgid(2) を使って設定できる。 自身のプロセス ID がプロセスグループ ID と同じプロセスは、 そのグループの「プロセスグループリーダー」である。
セッションは、同じセッション ID を共有するプロセスの集まりである。 ある一つのプロセスグループの全メンバーは同じセッション ID を持つ (つまり、一つのプロセスグループのメンバーは全て同じセッションに所属し、 これにより、セッションとプロセスグループで二階層のプロセス階層が形成できる)。 新たなセッションの生成はプロセスが setsid(2) を呼び出すことで行う。 setsid(2) は、 setsid(2) を呼び出したプロセスの PID と同じ値のセッション ID を持つ 新たなセッションを生成する。 セッションの生成者は「セッションリーダー」と呼ばれる。
あるセッションの全プロセスは一つの 制御端末 を共有する。 セッションリーダーが最初に端末をオープンした際に制御端末は設定される (open(2) の呼び出しで O_NOCTTY フラグが指定された場合を除く)。 一つの端末は、最大でも一つのセッションの制御端末にしかなれない。
一つのセッションのジョブの中で、フォアグラウンドジョブになれるのは最大でも一つで、そのセッションの他のジョブはバックグラウンドジョブである。 フォアグラウンドジョブだけが端末からの読み込みを行える。 バックグラウンドのプロセスが端末から読み込みを行おうとした場合、 フォアグラウンドジョブを停止させるシグナルである SIGTTIN が所属するプロセスグループに対して送信される。 端末に TOSTOP フラグがセットされていた場合 (termios(3) 参照)、 フォアグラウンドジョブだけが端末への書き込みを行える。 バックグラウンドのプロセスが端末への書き込みを行おうとした場合、 フォアグラウンドジョブを停止させるシグナルである SIGTTOU が生成される。 シグナルを生成する端末キー (例えば 中断キー、通常は control-C) が押された場合、 そのシグナルはフォアグラウンドジョブのプロセスに送信される。
様々なシステムコールやライブラリ関数で、プロセスグループの全メンバーに対して操作を行うことができる。 例えば、 kill(2), killpg(3), getpriority(2), setpriority(2), ioprio_get(2), ioprio_set(2), waitid(2), waitpid(2) など。 fcntl(2) の操作 F_GETOWN, F_GETOWN_EX, F_SETOWN, F_SETOWN_EX の議論も参照。
各プロセスは、数種類のユーザー ID とグループ ID を持つ。 ユーザー ID、グループ ID は整数で、それぞれ uid_t, gid_t 型で表現される (これらは <sys/types.h> で定義されている)。
Linux では、各プロセスは以下のような種類のユーザー ID とグループ ID を持つ。
fork(2) で生成された子プロセスは親プロセスのユーザー ID とグループ ID を継承する。 execve(2) の間、プロセスの実ユーザー/グループ ID と補助グループ ID 集合は不変である。 実効 ID と保存セット ID は変更される可能性がある (execve(2) で説明されている)。
上記の目的以外にも、プロセスのユーザー ID は他の様々な場面で利用される。
Subject to rules described in the relevant manual pages, a process can use the following APIs to modify its user and group IDs:
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、保存セット ID のユーザー ID / グループ ID および 補助グループ ID は POSIX.1 で規定されている。 ファイルシステムユーザー ID / グループ ID は Linux による拡張である。
Various fields in the /proc/[pid]/status file show the process credentials described above. See proc(5) for further information.
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)
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
2020-11-01 | Linux |