Provided by: manpages-ja-dev_0.5.0.0.20161015+dfsg-1_all 

名前
chown, fchown, lchown, fchownat - ファイルの所有者を変更する
書式
#include <unistd.h>
int chown(const char *pathname, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *pathname, uid_t owner, gid_t group);
#include <fcntl.h> /* AT_* 定数の定義 */
#include <unistd.h>
int fchownat(int dirfd, const char *pathname,
uid_t owner, gid_t group, int flags);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
fchown(), lchown():
_BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
|| /* glibc 2.12 以降: */ _POSIX_C_SOURCE >= 200809L
fchownat():
glibc 2.10 以降:
_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
glibc 2.10 より前:
_ATFILE_SOURCE
説明
これらのシステムコールは、いずれもファイルの所有者 (owner) とグループを変更する。システムコール chown(),
fchown(), lchown() 間の違いは、ファイルの指定の仕方だけである。
* chown() は pathname で指定されたファイルの所有権を変更する。 pathname がシンボリックリンクの場合は、リ
ンクの展開が行われる。
* fchown() はオープンされたファイルディスクリプター fd により参照されるファイルの所有権を変更する。
* lchown() は chown() と同じだが、シンボリックリンクを展開しない点が異なる。
特権を持つプロセス (Linux では CAP_CHOWN ケーパビリティ (capability) を持つプロセス) だけが ファイルの所
有者を変更できる。 ファイルの所有者は、その所有者が属しているグループのいずれかに ファイルのグループを変
更することができる。 特権 (Linux では CAP_CHOWN) を持つプロセスは、任意のグループに変更できる。
owner または group に -1 が指定された場合、それらの ID は変更されない。
非特権ユーザーにより実行ファイルの所有者またはグループが 変更された場合は S_ISUID と ISGID モードビットは
クリアされる。 POSIX はこの動作やルートが chown() を行なった場合については特に指定されていない。 Linux
における動作はカーネルのバージョンに依存する。 非グループ実行ファイル (S_IXGRP ビットが設定されていない
ファイル) の場合には S_ISGID ビットは強制ロック (mandatory locking) を意味している。 そしてそれは chown()
ではクリアできない。
fchownat()
fchownat() システムコールは chown() と全く同様に動作するが、以下で説明する点が異なる。
pathname で指定されたパス名が相対パスの場合、このパス名はファイルディスクリプター dirfd が参照するディレ
クトリに対する相対パスと解釈される (chown() に相対パス名を渡した場合のように、呼び出したプロセスのカレン
トワーキングディレクトリに対する相対パスではない)。
pathname で指定されたパス名が相対パスで、 dirfd が特別な値 AT_FDCWD の場合、 (chown() と同様に) pathname
は呼び出したプロセスのカレントワーキングディレクトリに対する相対パスと解釈される。
pathname で指定されたパス名が絶対パスの場合、 dirfd は無視される。
flags 引き数は、以下に示す値の 0 個以上の OR (論理和) をとって作成される ビットマスクである。
AT_EMPTY_PATH (Linux 2.6.39 以降)
pathname が空文字列の場合、 dirfd が参照するファイルに対して操作を行う (dirfd は open(2) O_PATH フ
ラグを使って取得することができる)。この場合、 dirfd は、ディレクトリだけでなく、任意のタイプのファ
イルを参照することができる。 dirfd が AT_FDCWD の場合、この呼び出しはカレントワーキングディレクト
リに対して操作を行う。このフラグは Linux 固有であり、その定義を得るには _GNU_SOURCE を定義するこ
と。
AT_SYMLINK_NOFOLLOW
pathname がシンボリックリンクの場合、リンクの展開を行わない。代わりに、lchown() 同様、リンク自身に
対して操作を行う。(デフォルトでは fchownat() は chown() と同様にシンボリックリンクの展開を行う。)
fchownat() の必要性についての説明については openat(2) を参照。
返り値
成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。
エラー
ファイルシステムによっては、下記の一覧にない他のエラーが返されることもある。
chown() でごく一般的なエラーを以下に挙げる:
EACCES パス名の構成要素に検索許可がない (path_resolution(7) も見よ)。
EFAULT pathname がアクセス可能なアドレス空間の外を指している。
ELOOP pathname を解決するときに、解決すべきシンボリックリンクが多すぎた。
ENAMETOOLONG
pathname が長過ぎる。
ENOENT ファイルが存在しない。
ENOMEM カーネルに十分なメモリーがない。
ENOTDIR
パス名の構成要素がディレクトリではない。
EPERM 呼び出したプロセスに所有者またはグループ (もしくはその両方) を変更するために 要求される許可 (上記
を参照) がない。
EROFS ファイルが読み込み専用 (read only) のファイルシステム上にある。
fchown() で一般的なエラーを以下に挙げる:
EBADF ディスクリプターが有効でない。
EIO i ノード (inode) を変更する際に低レベル I/O エラーが発生した。
ENOENT 上記を参照。
EPERM 上記を参照。
EROFS 上記を参照。
chown() で発生するのと同じエラーが fchownat() でも起こる。 fchownat() では以下のエラーも発生する。
EBADF dirfd が適切なファイルディスクリプターでない。
EINVAL flags に無効なフラグが指定された。
ENOTDIR
pathname が相対パスで、 dirfd がディレクトリ以外のファイルを参照しているファイルディスクリプターで
ある。
バージョン
fchownat() はカーネル 2.6.16 で Linux に追加された。 ライブラリによるサポートはバージョン 2.4 以降の
glibc で利用できる。
準拠
chown(), fchown(), lchown(): 4.4BSD, SVr4, POSIX.1-2001, POSIX.1-2008.
4.4BSD 版ではスーパーユーザーのみが使用できる (つまり、普通のユーザーはファイルを手放すことはできない)。
fchownat(): POSIX.1-2008.
注意
新しいファイルの所有権
(open(2) や mkdir(2) などにより) 新しいファイルが作成されるとき、 その所有者は呼び出したプロセスのファ
イルシステムユーザー ID と 同じに設定される。 そのファイルのグループはいくつかの要因により決定される。 そ
の要因としては、 ファイルシステムの種類、そのファイルシステムのマウント時に 使用されたオプション、親ディ
レクトリで set-group-ID 許可ビットが 有効になっているどうか、がある。 ファイルシステムが mount(8) オプ
ションの -o grpid (-o bsdgroups も同義語) と -o nogrpid (-o sysvgroups も同義語) に対応している場合、ルー
ルは以下の通りとなる。
* ファイルシステムが -o grpid 付きでマウントされている場合、新しいファイルのグループは 親ディレクトリのグ
ループと同じになる。
* ファイルシステムが -o nogrpid 付きでマウントされており、親ディレクトリでは set-group-ID ビットが 無効に
なっている場合、新しいファイルのグループは プロセスのファイルシステム GID と同じになる。
* ファイルシステムが -o nogrpid 付きでマウントされており、親ディレクトリでは set-group-ID ビットが 有効に
なっている場合、新しいファイルのグループは 親ディレクトリのグループと同じになる。
Linux 2.6.25 では、マウントオプション -o grpid と -o nogrpid に対応しているファイルシステムは ext2, ext3,
ext4, XFS である。 これらのマウントオプションに対応していないファイルシステムでは、 -o nogrpid に関する
ルールが適用される。
glibc での注意
fchownat() が利用できない古いカーネルでは、 glibc ラッパー関数は chown() を使用するモードにフォールバック
する。 pathname が相対パスの場合、 glibc は dirfd 引き数に対応する /proc/self/fd のシンボリックリンクに基
づいてパス名を構成する。
NFS
chown() 方式は UID マッピングを使用した NFS ファイルシステムを侵害する。 さらにファイルの内容にアクセス
する全てのシステムコールを侵害する。 これは chown() が既にオープンされたファイルに対する アクセスをただ
ちに取り消すことによる。 クライアント側のキャッシュにより所有権が変更されて ユーザーのアクセスが許した時
点と、実際に他のクライアントでユーザーによって ファイルにアクセスできる時点との間に時間差があるかもしれな
い。
歴史的な詳細
元々の Linux の chown(), fchown(), lchown() システムコールは、 16 ビットのユーザー ID とグループ ID だけ
に対応していた。 その後、 32 ビットの ID に対応した chown32(), fchown32(), lchown32() が Linux 2.4 で追加
された。 chown(), fchown(), and lchown() の glibc のラッパー関数は、 カーネルのバージョンによる違いを吸収
している。
Linux の 2.1.81 より前のバージョン (特に 2.1.46 以前) では、 chown() はシンボリックリンクを追跡しない。
Linux 2.1.81 以降では chown() はシンボリックリンクを追跡し、新たなシステムコール lchown() はシンボリック
リンクを追跡しない。 Linux 2.1.86 以降ではこの新しいコール (古い chown() と全く同じ動作を行なう) は同じ
システムコール番号を持ち chown() は新しく導入された番号を持つ。
例
以下のプログラムは、 二つ目のコマンドライン引き数で指定された名前のファイルの所有者を、 一つ目のコマンド
ライン引き数で指定された値に変更する。 新しい所有者は、数字のユーザー ID かユーザー名のいずれかで指定でき
る (ユーザー名で指定した場合には、 getpwnam(3) を使ってシステムのパスワードファイルの検索が行われ、 ユー
ザー ID への変換が行われる)。
プログラムのソース
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
uid_t uid;
struct passwd *pwd;
char *endptr;
if (argc != 3 || argv[1][0] == '\0') {
fprintf(stderr, "%s <owner> <file>\n", argv[0]);
exit(EXIT_FAILURE);
}
uid = strtol(argv[1], &endptr, 10); /* Allow a numeric string */
if (*endptr != '\0') { /* Was not pure numeric string */
pwd = getpwnam(argv[1]); /* Try getting UID for username */
if (pwd == NULL) {
perror("getpwnam");
exit(EXIT_FAILURE);
}
uid = pwd->pw_uid;
}
if (chown(argv[2], uid, -1) == -1) {
perror("chown");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
関連項目
chmod(2), flock(2), path_resolution(7), symlink(7)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告
に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
Linux 2014-08-19 CHOWN(2)