● setuid(), getuid(), setgid(), getgid()
実ユーザIDと実効ユーザID (実グループIDと実効グループID)。
● seteuid(), geteuid(), setegid(), getegid()
実効ユーザID、実効グループID。実行しているプロセスのことで、呼び出し元のことではないので注意。
ファイルシステムのUID,GIDのパーミッションのビットと関係が深い。よくわからない人は passwd プログラムのパーミッションを確認してみるとよい。
● setpgid(), getpgid()
プロセスグループID。killのpidにマイナスの値を設定する用途に使う。セッションIDにも関係するらしいけど私がまだよく理解できてない。setpgrp(), getpgrp() はもう使わなくてよいみたい。
● setsid(), getsid()
セッションID。ログインセッションの単位を管理する。Wikipedia: プロセスグループによると、CUIのころのこれらの考え方がGUI時代になってほとんど通用しなくなっているらしい、けど私がまだよく理解できていない。このへんも読んどくといいかもしれない → なぜnohupをバックグランドジョブとして起動するのが定番なのか?(擬似端末, Pseudo Terminal, SIGHUP他)
● setreuid(), setregid()
実ユーザIDと実効ユーザID、実グループIDと実効グループID。rootじゃない場合は、権限の関係で実ユーザと実効ユーザIDを入れ替えることもできないのでその用途で使う・・・と思う。でも↓の保存ユーザID(保存グループID)を使えばいいような・・・
● 保存ユーザID, 保存グループID
実ユーザID(実グループID)や実効ユーザID(実効グループID)が変更された場合、つまりsetuid(),setguid(),seteuid(),setegui()に、規則に基づいて変更前のIDがこの保存ユーザID(保存グループID)にコピーされる。再びseteuid()して元の権限に戻ろうとした時などに使われる。いつコピーされていつコピーされないかとか、保存ユーザIDと一致するものにのみseteuid()できるとか、この辺の規則が非常にややこしいので注意。
一言でまとめると、rootが所有者のファイルのUID/GIDビットを立てたりrootにsetuid()したりするのは、たいていセキュリティ的にろくなことがないのでやめておこう。