other versions
| CHOWN(2) | Linux Programmer's Manual | CHOWN(2) | 
名前¶
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() と同じだが、シンボリックリンクを展開しない点が異なる。
 
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() と同様にシンボリックリンクの展開を行う。)
 
返り値¶
成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。エラー¶
ファイルシステムによっては、下記の一覧にない他のエラーが返されることもある。 chown() でごく一般的なエラーを以下に挙げる:- EACCES
 - パス名の構成要素に検索許可がない ( path_resolution(7) も見よ)。
 
- EFAULT
 - pathname がアクセス可能なアドレス空間の外を指している。
 
- ELOOP
 - pathname を解決するときに、解決すべきシンボリックリンクが多すぎた。
 
- ENAMETOOLONG
 - pathname が長過ぎる。
 
- ENOENT
 - ファイルが存在しない。
 
- ENOMEM
 - カーネルに十分なメモリがない。
 
- ENOTDIR
 - パス名の構成要素がディレクトリではない。
 
- EPERM
 - 呼び出したプロセスに所有者またはグループ (もしくはその両方) を変更するために 要求される許可 (上記を参照) がない。
 
- EROFS
 - ファイルが読み込み専用 (read only) のファイルシステム上にある。
 
- EBADF
 - ディスクリプターが有効でない。
 
- EIO
 - i ノード (inode) を変更する際に低レベル I/O エラーが発生した。
 
- ENOENT
 - 上記を参照。
 
- EPERM
 - 上記を参照。
 
- EROFS
 - 上記を参照。
 
- 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.注意¶
元々の Linux の chown(), fchown(), lchown() システムコールは、 16 ビットのユーザ ID とグループ ID だけに対応していた。 その後、 32 ビットの ID に対応した chown32(), fchown32(), lchown32() が Linux 2.4 で追加された。 chown(), fchown(), and lchown() の glibc のラッパー関数は、 カーネルのバージョンによる違いを吸収している。 ( 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 ビットが 有効になっている場合、新しいファイルのグループは 親ディレクトリのグループと同じになる。
 
例¶
以下のプログラムは、 二つ目のコマンドライン引き数で指定された名前のファイルの所有者を、 一つ目のコマンドライン引き数で指定された値に変更する。 新しい所有者は、数字のユーザ 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.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。| 2014-03-19 | Linux |