chown() - ファイル/ディレクトリーの所有者またはグループの変更

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1
XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _POSIX_SOURCE
#include <unistd.h>

int chown(const char *pathname, uid_t owner, gid_t group);

機能説明

ファイルの所有者またはグループ (あるいはその両方) を変更します。pathname は、その所有者またはグループを 変更したいファイルの名前です。owner は、ファイルの新しい所有者のユーザー ID (UID) です。group は、ファイルの新規グループの グループ ID (GID) です。

_POSIX_CHOWN_RESTRICTED が unistd.h ヘッダー・ファイルに定義して ある場合、以下の条件のいずれかに該当するときにのみ、プロセスは、ファイルの グループを変更できます。

  1. プロセスに適切な特権がある。
  2. 以下のすべての項目に該当する。
    1. プロセスの有効ユーザー ID が、ファイル所有者のユーザー ID と 同じである。
    2. owner 引数がファイル所有者のユーザー ID と同じ か、または (uid_t)-1 である。
    3. group 引数は、有効グループ ID かまたは呼び出しプロセス の補足グループ ID である。

pathname が正規ファイルであるときに、ファイル・モードの S_IXUSR、 S_IXGRP、または S_IXOTH ビットの 1 つ以上が設定 されている場合、chown() は、ファイル・モード の set-user-ID (S_ISUID) ビットと set-group-ID (S_ISGID) ビットを クリアし、正常に戻ります。

pathname が正規ファイルでないときに、ファイル・モードの S_IXUSR、 S_IXGRP、または S_IXOTH ビットの 1 つ以上が設定 されている場合、chown() は、ファイルの set-user-ID (S_ISUID) ビット と set-group-ID (S_ISGID) ビットをクリアします。

chown() は、正常終了の場合には、ファイル の st_ctime フィールドに更新済みのマークを付けます。

XPG4.2 の特殊な動作: owner または group を それぞれ (uid_t)-1 または (gid_t)-1 と指定した 場合、ファイルの対応する ID は変更されません。

戻り値

chown() は、正常終了の場合には、ファイルの所有者、グループ、および変更時刻を更新して 0 を戻します。

正常に実行されなかった場合、chown() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EACCES
プロセスに、pathname 接頭部の一部のコンポーネントの検索許可がありません。
EINTR
XPG4.2 に関して追加: キャッチされたシグナルによって chown() 関数が割り込まれました。
EINVAL
owner または group が、有効なユーザー ID (UID) やグループ ID (GID) ではありません。
EIO
XPG4.2 に関して追加: ファイル・システムの読み取り中または書き込み中に入出力エラーが発生しました。
ELOOP
ループがシンボリック・リンクに存在しています。pathname の解決で検出されたシンボリック・リンク の数が、POSIX_SYMLOOP (limits.h header ファイルで定義された値) よりも大きい場合、このエラーが発行されます。
ENAMETOOLONG
_POSIX_NO_TRUNC が有効ですが、pathnamePATH_MAX 文字より長いか、または pathname の一部のコンポーネントが NAME_MAX 文字より長くなっています。シンボリック・リンクの場合、シンボリック・リンクの代替となる pathname ストリングの長さが PATH_MAX を超えています。PATH_MAX 値と NAME_MAX 値は 、pathconf() を使用して確認できます。
ENOENT
pathname という名前のファイルがないか、あるいは pathname 引数が空ストリングです。
ENOTDIR
pathname 接頭部のコンポーネントの一部がディレクトリーではありません。
EPERM
呼び出しプロセスの有効ユーザー ID が ファイルの所有者に一致しません。あるいは、呼び出しプロセスに適切な特権、つまり スーパーユーザー権限 (UID=0) がありません。
EROFS
pathname は読み取り専用ファイル・システムにあります。

CELEBC12
⁄* CELEBC12

   This example changes the owner and group of a file.

 *⁄
#define _POSIX_SOURCE
#include <unistd.h>
#include <sys⁄stat.h>
#include <sys⁄types.h>
#undef _POSIX_SOURCE
#include <stdio.h>

main() {
  char fn[]=".⁄temp.file";
  FILE *stream;
  struct stat info;

  if ((stream = fopen(fn, "w")) == NULL)
    perror("fopen() error");
  else {
    fclose(stream);
    stat(fn, &info);
    printf("original owner was %d and group was %d¥n", info.st_uid,
           info.st_gid);
    if (chown(fn, 25, 0) != 0)
      perror("chown() error");
    else {
      stat(fn, &info);
      printf("after chown(), owner is %d and group is %d¥n",
             info.st_uid, info.st_gid);
    }
    unlink(fn);
  }
}
出力:
original owner was 0 and group was 0
after chown(), owner is 25 and group is 0

関連情報