名前
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);
glibc
向けの機能検査マクロの要件
( feature_test_macros(7) 参照):
fchmod():
glibc 2.24 以降:
_POSIX_C_SOURCE >= 199309L 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():
_POSIX_C_SOURCE >= 199309L 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
- glibc 2.10 以降:
- _POSIX_C_SOURCE >= 200809L
- glibc 2.10 より前:
- _ATFILE_SOURCE
説明
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:- *
- chmod() は、 pathname で指定されたパス名を持つファイルのモードを変更する。 pathname がシンボリックリンクの場合は、リンクの展開が行われる。
- *
- fchmod() は、オープンされたファイルディスクリプター fd により参照されるファイルのモードを変更する。
- 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)
- 他人による実行 / 検索
fchmodat()
fchmodat() システムコールは chmod() と全く同様に動作するが、以下で説明する点が異なる。 pathname で指定されたパス名が相対パスの場合、このパス名はファイルディスクリプター dirfd が参照するディレクトリに対する相対パスと解釈される ( chmod() に相対パス名を渡した場合のように、呼び出したプロセスのカレントワーキングディレクトリに対する相対パスではない)。 pathname で指定されたパス名が相対パスで、 dirfd が特別な値 AT_FDCWD の場合、 ( chmod() と同様に) pathname は呼び出したプロセスのカレントワーキングディレクトリに対する相対パスと解釈される。 pathname で指定されたパス名が絶対パスの場合、 dirfd は無視される。 flags には 0 か、以下のフラグを指定することができる。- AT_SYMLINK_NOFOLLOW
- pathname がシンボリックリンクの場合、リンクの展開を行わない。代わりに、リンク自身に対して操作を行う。このフラグは現在のところ実装されていない。
返り値
成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。エラー
ファイルシステムによっては、下記の一覧にない他のエラーが返されることもある。 chmod() のごく一般的なエラーを挙げる:- EACCES
- パス名の構成要素に検索許可がない ( path_resolution(7) も見よ)。
- EFAULT
- pathname がアクセス可能なアドレス空間の外を指している。
- EIO
- I/O エラーが発生した。
- ELOOP
- pathname を解決するときに、解決すべきシンボリックリンクが多すぎた。
- ENAMETOOLONG
- pathname が長過ぎる。
- ENOENT
- ファイルが存在しない。
- ENOMEM
- カーネルに十分なメモリーがない。
- ENOTDIR
- パス名の構成要素がディレクトリではない。
- EPERM
- 実効 UID がファイルの所有者と一致せず、プロセスに特権がない (Linux では CAP_FOWNER ケーパビリティを持たない)。
- EPERM
- The file is marked immutable or append-only. (See ioctl_iflags(2).)
- EROFS
- ファイルが読み込み専用 (read only) のファイルシステム上にある。
- EBADF
- ファイルディスクリプター fd が有効でない。
- EIO
- 上記を参照。
- EPERM
- 上記を参照。
- EROFS
- 上記を参照。
- EBADF
- dirfd が適切なファイルディスクリプターでない。
- EINVAL
- flags に無効なフラグが指定された。
- ENOTDIR
- pathname が相対パスで、 dirfd がディレクトリ以外のファイルを参照しているファイルディスクリプターである。
- ENOTSUP
- flags に対応していないフラグ AT_SYMLINK_NOFOLLOW が指定された。
バージョン
fchmodat() はカーネル 2.6.16 で Linux に追加された。 ライブラリによるサポートはバージョン 2.4 以降の glibc で利用できる。準拠
chmod(), fchmod(): 4.4BSD, SVr4, POSIX.1-2001i, POSIX.1-2008. fchmodat(): POSIX.1-2008.注意
C ライブラリとカーネルの違い
GNU C ライブラリの fchmodat() ラッパー関数は、このページで説明している POSIX で規定されたインターフェースを実装している。このインターフェースは、内部で呼ばれる Linux のシステムコールとは異なる。システムコールは flags 引数を持たない。glibc での注意
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 |