CHMOD(2) | Linux Programmer's Manual | CHMOD(2) |
chmod, fchmod, fchmodat - ファイルのモードを変更する
#include <sys/stat.h>
int chmod(const char *pathname, mode_t mode); int fchmod(int fd, mode_t mode); #include <fcntl.h> /* AT_* 定数の定義 */ #include <sys/stat.h>
int fchmodat(int dirfd, const char *pathname, mode_t mode, int flags);
fchmod():
glibc 2.19 から 2.23 まで
_POSIX_C_SOURCE
glibc 2.16 から 2.19 まで:
_BSD_SOURCE || _POSIX_C_SOURCE
glibc 2.12 から 2.16 まで:
_BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
_POSIX_C_SOURCE >= 200809L
glibc 2.11 以前:
_BSD_SOURCE || _XOPEN_SOURCE >= 500
fchmodat():
The chmod() and fchmod() system calls change a files mode bits. (The file mode consists of the file permission bits plus the set-user-ID, set-group-ID, and sticky bits.) These system calls differ only in how the file is specified:
新しいファイルモードは mode で指定される。 mode は、以下に示す値の 0 個以上の OR (論理和) をとって作成される ビットマスクである。
呼び出したプロセスの実効 (effective) UID がファイルの所有者と一致するか、 そのプロセスが特権を持たなければならない (Linux では CAP_FOWNER ケーパビリティ (capability) を持たなければならない)。
呼び出したプロセスに特権がなく (Linux では CAP_FSETID ケーパビリティがなく)、かつファイルのグループ ID が プロセスの実効グループ ID または補助的なグループ ID にマッチしない場合、 S_ISGID ビットはオフにされるが、これによってエラーが返されることはない。
安全のための処置として、 ファイルシステムによっては、ファイルの書き込みを行う時に set-user-ID とset-group-ID ビットと実行ビットが オフにされることがある。 (Linux では、書き込みプロセスが CAP_FSETID ケーパビリティを持っていない場合に、これが起こる。) ファイルシステムの中には、スーパーユーザーだけが 特別の意味を持つスティッキービットを設定できるものがある。 スティッキービットとディレクトリに対する set-user-ID (set-group-ID) ビットについては、 inode(7) を見よ。
NFS ファイルシステム上では、パーミッションを制限すると、 既にオープンされているファイルに対してすぐに影響が及ぶ。 これはアクセス制御がサーバー上で行われているが、 オープンされているファイルはクライアント側で管理されているためである。 クライアント側でファイル属性のキャッシュが有効になっている場合に、 パーミッションの制限を緩くすると、 他のクライアントに情報が伝わるのが遅れるかもしれない。
fchmodat() システムコールは chmod() と全く同様に動作するが、以下で説明する点が異なる。
pathname で指定されたパス名が相対パスの場合、このパス名はファイルディスクリプター dirfd が参照するディレクトリに対する相対パスと解釈される (chmod() に相対パス名を渡した場合のように、呼び出したプロセスのカレントワーキングディレクトリに対する相対パスではない)。
pathname で指定されたパス名が相対パスで、 dirfd が特別な値 AT_FDCWD の場合、 (chmod() と同様に) pathname は呼び出したプロセスのカレントワーキングディレクトリに対する相対パスと解釈される。
pathname で指定されたパス名が絶対パスの場合、 dirfd は無視される。
flags には 0 か、以下のフラグを指定することができる。
fchmodat() の必要性についての説明については openat(2) を参照。
成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。
ファイルシステムによっては、下記の一覧にない他のエラーが返されることもある。
chmod() のごく一般的なエラーを挙げる:
fchmod() で一般的なエラーを挙げる:
chmod() で発生するのと同じエラーが fchmodat() でも起こる。 fchmodat() では以下のエラーも発生する。
fchmodat() はカーネル 2.6.16 で Linux に追加された。 ライブラリによるサポートはバージョン 2.4 以降の glibc で利用できる。
chmod(), fchmod(): 4.4BSD, SVr4, POSIX.1-2001i, POSIX.1-2008.
fchmodat(): POSIX.1-2008.
GNU C ライブラリの fchmodat() ラッパー関数は、このページで説明している POSIX で規定されたインターフェースを実装している。このインターフェースは、内部で呼ばれる Linux のシステムコールとは異なる。システムコールは flags 引数を持たない。
fchmodat() が利用できない古いカーネルでは、 glibc ラッパー関数は chmod() を使用するモードにフォールバックする。 pathname が相対パスの場合、 glibc は dirfd 引数に対応する /proc/self/fd のシンボリックリンクに基づいてパス名を構成する。
chmod(1), chown(2), execve(2), open(2), stat(2), inode(7), path_resolution(7), symlink(7)
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
2017-09-15 | Linux |