CHOWN(2)

이름
chown, fchown, lchown - 파일에 대한 소유권을 바꾼다.

사용법
#include <sys/types.h>
#include <unistd.h>

int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);

설명
path나 fd로 지정된 파일의 소유자를 바꾼다. 슈퍼 사용자(root)만이 파일의 소유자를 바꿀수 있다. 파일의 소유자는 파일의 그룹을 그 소유자가 멤버인 어떤 그룹으로 바꿀수 있다. 슈퍼 사용자는 임의로 그룹을 변경할 수 있다. owner나 group가 -1로 지정되었다면, 그 ID는 바뀌지 않는다. 실행 파일의 소유자나 그룹이 슈퍼 사용자(root)가 아닌 사용자에 의해 변경되면, S_ISUID 그리고 S_ISGID 모드 비트는 지워진다(clear). POSIX는 루트(root)가 chown을 할 때 이 작업이 실행 가능한 지 여부를 기술하지 않는다; 리눅스에서는 이 작업이 커널 버전에 의존한다. 그룹에 의해 실행되는 파일이 아닐 경우에는 S_ISGID 비트는 권고 잠금 (mandatory locking)을 가리키며 (S_IXGRP bit는 지워진다), chown에 의해 지워지지 않는다.

반환값
성공시, 0을 반환한다. 에러시, -1이 반환하며, errno는 적당한 값으로 설정된다.

에러
파일 시스템에 의존하여, 다른 에러 코드가 반환될 수 있다. chown의 일반적인 에러 목록은 다음과 같다:

EPERM
    유효 UID는 파일의 소유자와 일치하지 않으며 0이 아니다; 또는 소유자나 그룹이 정확히 지정되지 않았다.

EROFS
    지정된 파일이 읽기-전용 파일 시스템에 있다.

EFAULT
    path가 접근할수 없는 주소 공간을 가리키고 있다.

ENAMETOOLONG
    path가 너무 길다.

ENOENT
    파일이 존재하지 않는다.

ENOMEM
    이용할 수 있는 커널 메모리가 충분하지 않다.

ENOTDIR
    경로명의 앞부분(prefix)이 디렉토리가 아니다.

EACCES
    찾기 허가권이 경로명의 앞부분에서 거부되었다.

ELOOP
    너무 많은 심볼릭 링크를 path에서 만났다.

fchown의 일반적 에러는 아래와 같다:

EBADF
    기술자가 유효하지 않다.

ENOENT
    위를 참조해라.

EPERM
    위를 참조해라.

EROFS
    위를 참조해라.

EIO 하위 레벨 I/O 에러가 inode 수정 시 발생했다.

주의
2.1.81이전의 리눅스 버전에서 chown는 심볼릭 링크를 허용하지 않는다. 리눅스 커널 2.1.81 이후에, chown 심볼릭 링크를 허용하며, 새로운 시스템 콜 lchown는 심볼릭 링크를 허용하지 않는다. 리눅스 커널 2.1.86 이후에, 이 새로운 시스템 콜(예전의 chown과 같은 의미을 가지고 있는)은 같은 시스템 콜 수를 가지고 있으며, chown에서는 새로운 시스템 콜 수를 가지게 되었다.

fchown의 원형은 _BSD_SOURCE가 정의되어 있을 경우에만 이용할 수 있다.

호환
chown 시스템 콜은 SVr4, SVID, POSIX, X/OPEN 에서 확실하다. 4.4BSD 버전은 슈퍼 사용자만이 사용할 수 있다.(즉, 일반적인 사용자는 파일을 바꿀 수 없다.) SVr4 문서는 EINVAL, EINTR, ENOLINK 그리고 EMULTIHOP 반환을 문서화 했지만, ENOMEM은 아니다. POSIX.1에서는 ENOMEM 또는 ELOOP 에러 조건을 문서화 하지 않았다.

fchown 시스템 콜은 4.4BSD 그리고 SVr4 에서 확실하다. SVr4은 EINVAL, EIO, EINTR, 그리고 ENOLINK 에러 조건을 추가적으로 문서화 했다.

제한
chown()의 의미(semantic)은 UID 대응이 가능한 NFS 파일 시스템에서는 적용되지 않을 수도 있다. 추가적으로, 파일 내용을 접근하는 모든 시스템 콜의 의미은 적용되지 않을 수 있다. 왜냐하면 chown()가 이미 열려진 파일에 접근 취소를 일으킬 수 있기 때문이다. 클라이언트 쪽 캐싱(caching)은 소유권이 사용자의 접근을 허용하도록 바뀔 수 있는 시간과 파일이 다른 클라이언트 쪽 사용자에 의해 접근될 수 있는 시간 사이에 연기될지도 모른다.

관련 항목
chmod(2), flock(2)

역자
정강훈    <skyeyes@soback.kornet.net>, 2000년 5월 26일