書式
#include <sys/types.h>#include <unistd.h>
int setuid(uid_t uid);
説明
setuid() は呼び出し元のプロセスの実効 (effective) ユーザー ID を設定する。 もし呼び出し元プロセスの実効 UID が root ならば、 実 (real) UID と保存 (saved) set-user-ID も設定される。Linux では、 setuid() は _POSIX_SAVED_IDS をもった POSIX 版のように実装されている。 これは (ルート以外の) set-user-ID プログラムにそのユーザーの特権を 全て与え、特権の必要ない仕事をし、本来の実効ユーザー ID に 安全な方法で再び戻すことを許す。
ユーザーが root またはプログラムが root に set-user-ID されているならば、 特別の注意が払われる。 setuid() 関数は呼び出し者の実効ユーザー ID をチェックし、 それがスーパーユーザーならば、 プロセスに関連する全てのユーザー ID に uid を設定する。 これが行なわれた後にはプログラムが再びルートの特権を得ることはできない。
したがって、set-user-ID-root プログラムで、一時的にルート特権を解除し、 非特権ユーザであるかのように振舞い、後でルート権限をもう一度得ようと する場合には、 setuid() を使うことができない。その場合には、 seteuid(2) を使う必要がある。
返り値
成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。エラー
- EAGAIN
- uid が現在のユーザー ID とマッチせず、この uid によってプロセスがリソース上限 RLIMIT_NPROC を超えた。
- EPERM
- ユーザーが特権を持たず (Linux では CAP_SETUID ケーパビリティ (capability) を持たず)、 uid が呼び出し元プロセスの実 UID または保存 set-user-ID と一致しない。
準拠
SVr4, POSIX.1-2001. 4.4BSD のコールとは完全な互換性はない、 BSD のコールは実 (real)、保存 (saved)、実効 (effective) ID の全てを設定する。注意
Linux はファイルシステム・ユーザー ID の概念を持つ。 通常、これは実効ユーザー ID に等しい。 setuid() コールは呼び出し元のプロセスの ファイルシステム・ユーザー ID も設定する。 setfsuid(2) も参照すること。uid が前の実効 UID と異っていた場合、 プロセスはコアダンプすることを禁止される。
元々の Linux の setuid() システムコールは 16 ビットのグループ ID だけに対応していた。 その後、Linux 2.4 で、32 ビットの ID に対応した setuid32() が追加された。 glibc の setuid() のラッパー関数は カーネルバージョンによるこの違いを吸収している。
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。