CHMOD(2)

명칭
chmod, fchmod, lchmod - 파일의 모드를 변경한다

프로그램 라이브러리
libc

서식
<sys/stat.h> int chmod(const char *path, mode_t mode) int fchmod(int fd, mode_t mode) int lchmod(const char *path, mode_t mode)

해설
path 그리고 지정되는지, 또는 파일 기술자 fd 그리고 참조되는 파일의 파일 허가 비트를 mode (으)로 변경합니다. chmod() 함수는, 프로세스 소유자 (유저)(이)가 path (또는 fd) 그리고 지정된 파일을 소유하는지, 또는 슈퍼 유저로 있을까의 어느 쪽인지인 것을 확인합니다. chmod() 함수는, 기호 연결을 더듬어, 링크 자체는 아니고 링크의 타겟으로 작용합니다.

lchmod 함수는 chmod() 에 유사하고 있습니다만, 기호 연결을 더듬지 않습니다.

모드는 <sys/stat.h> 그리고 정의된 허가 비트 마스크의 논리합 (or) (으)로부터 작성됩니다:

    #define S_IRWXU 0000700    /* 소유자용의 RWX 마스크 */
    #define S_IRUSR 0000400    /* 소유자용의 R */
    #define S_IWUSR 0000200    /* 소유자용의 W */
    #define S_IXUSR 0000100    /* 소유자용의 X */
    #define S_IRWXG 0000070    /* 그룹용의 RWX 마스크 */
    #define S_IRGRP 0000040    /* 그룹용의 R */
    #define S_IWGRP 0000020    /* 그룹용의 W */
    #define S_IXGRP 0000010    /* 그룹용의 X */
    #define S_IRWXO 0000007    /* 그 외용의 RWX 마스크 */
    #define S_IROTH 0000004    /* 그 외용의 R */
    #define S_IWOTH 0000002    /* 그 외용의 W */
    #define S_IXOTH 0000001    /* 그 외용의 X */
    #define S_ISUID 0004000    /* 실행시에 유저 ID 를 설정 */
    #define S_ISGID 0002000    /* 실행시에 그룹 ID 를 설정 */
    #define S_ISVTX 0001000    /* 스티키빗트 */
    #ifndef _POSIX_SOURCE
    #define S_ISTXT 0001000
    #endif

FreeBSD VM 시스템은, 실행 가능 모듈에 대해 스티키빗트 (ISVTX) (을)를 완전하게 무시합니다. UFS 를 베이스로 한 파일 시스템 (FFS, MFS, LFS)에서는, 스티키빗트는 디렉토리에만 설정할 수 있습니다.

ISVTX (`스티키빗트')(이)가 설정되어 있는 디렉토리에서는, 특권이 없는 유저는, 그 디렉토리내에 있는 것 외 유저의 파일의 삭제, 이름의 변경을 할 수 없습니다. 어느 유저라도, 그 유저가 소유할까 적절한 허가가 있는 디렉토리에 도착해 스티키빗트를 설정할 수 있습니다. 스티키빗트의 성질의 상세한 것에 대하여는, sticky(8) (을)를 참조해 주세요.

어느 디렉토리에 ISUID (set-user-id 비트)가 설정되어 있어 한편 파일 시스템을 mount 할 때에 MNT_SUIDDIR 옵션이 지정되어 있었을 경우, 이 디렉토리내에 작성되는 새로운 파일과 서브 디렉토리의 소유자는, 디렉토리의 소유자로 설정됩니다. 이 기능이 유효하다라고 와, 새로운 디렉토리는 부모로부터 ISUID 비트를 계승합니다. 실행 비트는 파일로부터 제거되어 파일은 root 의 소유는 되지 않습니다. 이 기능은, 파일에의 기록이 유저에게 허가되는 조건을 변경하지 않습니다. 파일이 작성된 후의 최종적인 소유자의 결정에 영향을 줄 뿐입니다. 그룹은 계승되지 않습니다.

이 기능은, ftp, SAMBA 또는 netatalk 경유의 PC 유저에게로의 파일 서비스로 사용되도록(듯이) 설계되고 있습니다. 이것은 쉘 유저에게 보안 홀을 제공하므로, Group inheritance is not affected. 특히, 홈 디렉토리에서는 사용해 되지 않습니다. 이 옵션이 기능하기 위해서는, 커널내에 SUIDDIR 옵션이 필요합니다. UFS 파일 시스템만이 이 옵션을 서포트합니다. suiddir mount 옵션의 상세한 것에 대하여는, mount(8) (을)를 참조해 주세요.

슈퍼 유저 이외의 유저에 의한, 파일의 기록 또는 파일의 소유자의 변경에 의해 set-user-id 비트와 set-group-id 비트는 오프로 전환할 수 있습니다. 호환성은 희생이 됩니다만, set-user-id (set-group-id) 비트를 남긴 채로 파일이 변경되는 것을 막는 것으로, 시스템은 얼마인가 안전하게 됩니다.

반환값

에러
chmod() (은)는 다음의 경우에 처리에 실패해 파일 모드는 변경되지 않습니다.

[ENOTDIR]
    패스의 원가요소중에 디렉토리 이외의 것이 포함되어 있습니다.

[ENAMETOOLONG]
    패스명의 원가요소가 255 캐릭터를 넘고 있는지, 또는 패스명 전체가 1023 캐릭터를 넘고 있습니다.

[ENOENT]
    지정된 파일이 존재하지 않습니다.

[EACCES]
    지정된 패스에는, 검색이 허가되어 있지 않은 디렉토리가 포함되어 있습니다.

[ELOOP]
    패스명을 변환할 경우에 검출된 기호 연결이 너무 많습니다.

[EPERM]
    실효 유저 ID 가 파일의 소유자와 일치하지 않고, 실효 유저 ID 가 슈퍼 유저가 아닙니다.

[EROFS]
    지정된 파일은 읽기 전용 파일 시스템상에 있습니다.

[EFAULT]
    path (은)는, 프로세스에 할당할 수 있었던 address 공간의 범위외를 가리키고 있습니다.

[EIO]
    파일 시스템에 읽고 쓰기하고 있는 동안에 입출력 에러가 발생했습니다.

[EFTYPE]
    실행 가능 모듈상에서 스티키빗트를 설정하려고 했습니다.

fchmod() (은)는 다음의 경우에 처리를 실패합니다.

[EBADF]
    기술자가 유효하지는 않습니다.

[EINVAL]
    fd 하지만 파일은 아니고 소켓을 참조하고 있습니다.

[EROFS]
    파일이 읽기 전용의 파일 시스템상에 놓여져 있습니다.

[EIO]
    파일 시스템에 읽고 쓰기하고 있는 동안에 입출력 에러가 발생했습니다.

관련 항목
chmod(1), chown(2), open(2), stat(2), sticky(8)

표준
chmod() 함수는 EFTYPE 하지만 돌려주어지는 것으로 S_ISTXT 의 사용법을 제외하면 p1003.1-90 에 준거하고 있습니다.

역사
chmod() 함수는 AT&T UNIX 그리고 등장했습니다. fchmod() 함수는 4.2BSD 그리고 등장했습니다. lchmod() 함수는 FreeBSD 3.0 그리고 등장했습니다.