CHMOD(2)

名前
chmod, fchmod - ファイルのモードを変更する

書式
#include <sys/stat.h>

int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);

glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):

fchmod():
    _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
    || /* glibc 2.12 以降: */ _POSIX_C_SOURCE >= 200809L

説明
これらのシステムコールはファイルのアクセス許可 (permission) を変更する。 システムコール間の違いは、ファイルの指定の仕方だけである。

*   chmod() は、 path で指定されたパス名を持つファイルの許可を変更する。 path がシンボリックリンクの場合は、リンクの展開が行われる。

*   fchmod() は、オープンされたファイルディスクリプタ fd により参照されるファイルの許可を変更する。

新しいファイル許可は mode で指定される。 mode は、以下に示す値の 0 個以上の OR (論理和) をとって作成される ビットマスクである。

S_ISUID  (04000)
    set-user-ID (execve(2) 時にプロセスの実効ユーザ ID にセットされる)

S_ISGID  (02000)
    set-group-ID (以下の場合に (execve(2) 実行時にプロセスの実効グループ ID にセットされる、 強制ロック (mandatory locking) を行う (fcntl(2) の説明を参照)、 新しいファイルのグループとして親ディレクトリと同じものを使う (chown(2) と (mkdir(2) の説明を参照)

S_ISVTX  (01000)
    スティッキービット (sticky bit) (削除制限フラグ、 unlink(2) の説明を参照)

S_IRUSR  (00400)
    所有者による読み取り

S_IWUSR  (00200)
    所有者による書き込み

S_IXUSR  (00100)
    所有者による実行 (execute) / 検索 (search) (「検索」はディレクトリに対して適用されるもので、 そのディレクトリ内のエントリーへアクセスできるかを意味する)

S_IRGRP  (00040)
    グループによる読み取り

S_IWGRP  (00020)
    グループによる書き込み

S_IXGRP  (00010)
    グループによる実行 / 検索

S_IROTH  (00004)
    他人 (others) による読み取り

S_IWOTH  (00002)
    他人による書き込み

S_IXOTH  (00001)
    他人による実行 / 検索

呼び出したプロセスの実効 (effective) UID がファイルの所有者と一致するか、 そのプロセスが特権を持たなければならない (Linux では CAP_FOWNER ケーパビリティ (capability) を持たなければならない)。 呼び出したプロセスに特権がなく (Linux では CAP_FSETID ケーパビリティがなく)、かつファイルのグループ ID が プロセスの実効グループ ID または補助的なグループ ID にマッチしない場合、 S_ISGID ビットはオフにされるが、これによってエラーが返されることはない。 安全のための処置として、 ファイルシステムによっては、ファイルの書き込みを行う時に セット・ユーザー ID とセット・グループ ID ビットと実行ビットが オフにされることがある。 (Linux では、書き込みプロセスが CAP_FSETID ケーパビリティを持っていない場合に、これが起こる。) ファイルシステムの中には、スーパーユーザーだけが 特別の意味を持つスティッキービットを設定できるものがある。 スティッキービットとディレクトリに対する セット・ユーザー (グループ) ID ビットについては、 stat(2) を見よ。 NFS ファイルシステム上では、パーミッションを制限すると、 既にオープンされているファイルに対してすぐに影響が及ぶ。 これはアクセス制御がサーバー上で行われているが、 オープンされているファイルはクライアント側で管理されているためである。 クライアント側でファイル属性のキャッシュが有効になっている場合に、 パーミッションの制限を緩くすると、 他のクライアントに情報が伝わるのが遅れるかもしれない。

返り値
成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。

エラー
ファイルシステムによっては他のエラーを返す場合がある。 chmod() で一般的なエラーを以下に挙げる。

EACCES
    パス名の構成要素に検索許可がない (path_resolution(7) も見よ)。

EFAULT
    path がアクセスできるアドレス空間外を指している。

EIO I/O エラーが発生した。

ELOOP
    path を解決する際に遭遇したシンボリックリンクが多過ぎる。

ENAMETOOLONG
    path が長過ぎる。

ENOENT
    ファイルが存在しない。

ENOMEM
    カーネルに十分なメモリがない。

ENOTDIR
    パス名の構成要素がディレクトリではない。

EPERM
    実効 UID がファイルの所有者と一致せず、プロセスに特権がない (Linux では CAP_FOWNER ケーパビリティを持たない)。

EROFS
    ファイルが読み込み専用 (read only) のファイルシステム上にある。

fchmod() で一般的なエラーを挙げる:

EBADF
    ファイルディスクリプタ fd が有効でない。

EIO 上記を参照。

EPERM
    上記を参照。

EROFS
    上記を参照。

準拠
4.4BSD, SVr4, POSIX.1-2001.

関連項目
chown(2), execve(2), fchmodat(2), open(2), stat(2), path_resolution(7)

この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.54 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。