STAT(2)

명칭
stat, lstat, fstat - file status의 취득

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/stat.h> int stat(const char *path, struct stat *sb) int lstat(const char *path, struct stat *sb) int fstat(int fd, struct stat *sb)

해설
stat() 함수는, path 하지만 가리키는 파일의 정보를 취득합니다. 지정한 파일의 읽기권, 기록권, 실행권은 필요 없습니다. 그러나, 그 파일에 도달하는 패스명으로 열거된 모든 디렉토리는, 검색 가능하다라고 하는 것이 필요합니다.

lstat() 하 stat() (을)를 닮아 있습니다만, 지정한 파일이 기호 연결인 경우는 다릅니다. lstat() (은)는 링크의 정보를 되돌립니다만, stat() (은)는 링크가 참조하는 파일의 정보를 돌려줍니다.

fstat() (은)는, 파일 기술자 fd 그리고 구별되는 오픈 파일에 대해, 위와 같은 정보를 취득합니다.

인수 sb (은)는, 구조체 stat() 에의 포인터입니다. 이것은, <sys/stat.h> (아래와 같이 참조)(으)로 정의되어 파일에 관한 정보를 보관 유지합니다.

    struct stat {
        dev_t     st_dev;           /* inode 의 디바이스 */
        ino_t     st_ino;           /* inode 번호 */
        mode_t    st_mode;          /* inode 보호 모드 */
        nlink_t   st_nlink;         /* 하드 링크수 */
        uid_t     st_uid;           /* 파일 소유자의 유저 ID */
        gid_t     st_gid;           /* 파일 그룹의 그룹 ID */
        dev_t     st_rdev;          /* 디바이스 타입 */
    #ifndef _POSIX_SOURCE
        struct timespec st_atimespec; /* 마지막 액세스 시각 */
        struct timespec st_mtimespec; /* 마지막 데이터 수정 시각 */
        struct timespec st_ctimespec; /* 마지막 file status 수정 시각 */
    #else
        time_t    st_atime;         /* 마지막 액세스 시각 */
        long      st_atimensec;     /* 마지막 액세스 시각의 나노초 */
        time_t    st_mtime;         /* 마지막 데이터 수정 시각 */
        long      st_mtimensec;     /* 마지막 데이터 수정 시각의 나노초 */
        time_t    st_ctime;         /* 마지막 file status 수정 시각 */
        long      st_ctimensec;     /* 마지막 file status 수정 시각의 나노초 */
    #endif
        off_t     st_size;          /* 바이트 단위의 파일의 크기 */
        int64_t   st_blocks;        /* 파일에 할당할 수 있었던 블록수 */
        u_int32_t st_blksize;       /* 입출력에 최적인 블록 사이즈 */
        u_int32_t st_flags;         /* 파일에 대한 유저 정의 플래그 */
        u_int32_t st_gen;           /* 파일 생성 번호 */
    };

struct stat 의 시각에 관한 필드는, 이하대로입니다.

st_atime
    파일의 데이터가 마지막에 액세스 되었을 때 각. mknod(2), utimes(2), read(2) 시스템 콜로 변경됩니다.

st_mtime
    파일의 데이터가 마지막에 수정되었을 때 각. mknod(2), utimes(2), write(2) 시스템 콜로 변경됩니다.

st_ctime
    file status가 마지막에 변경되었을 때 각 (inode 데이터의 수정). chmod(2), chown(2), link(2), mknod(2), rename(2), unlink(2), utimes(2), write(2) 시스템 콜로 변경됩니다.

_POSIX_SOURCE 하지만 정의되어 있지 않은 경우, 시각에 관한 필드는 이하와 같이 정의됩니다.

    #ifndef _POSIX_SOURCE
    #define st_atime st_atimespec.tv_sec
    #define st_mtime st_mtimespec.tv_sec
    #define st_ctime st_ctimespec.tv_sec
    #endif

struct stat 의 사이즈에 관한 필드는, 이하대로입니다.

st_blksize
    파일의 최적인 입출력 블록 사이즈.

st_blocks
    파일에 512 바이트 단위로 할당할 수 있었던 블록의 실제의 수. 짧은 기호 연결이 inode 에 보관 유지되고 있는 경우, 이 수치가 0 이 되는 일이 있습니다.

스테이터스 정보 워드 st_mode 에는, 이하와 같은 비트가 있습니다.

    #define S_IFMT 0170000           /* 파일의 타입 */
    #define        S_IFIFO  0010000  /* 이름 첨부 파이프 (fifo) */
    #define        S_IFCHR  0020000  /* 캐릭터형 특수 파일 */
    #define        S_IFDIR  0040000  /* 디렉토리 */
    #define        S_IFBLK  0060000  /* 블록형 특수 파일 */
    #define        S_IFREG  0100000  /* 통상 */
    #define        S_IFLNK  0120000  /* 기호 연결 */
    #define        S_IFSOCK 0140000  /* 소켓 */
    #define        S_IFWHT  0160000  /* 화이트 아웃 */
    #define S_ISUID 0004000  /* 실행시에 유저 ID 를 설정 */
    #define S_ISGID 0002000  /* 실행시에 그룹 ID 를 설정 */
    #define S_ISVTX 0001000  /* 사용후에도 스왑 된 텍스트를 보존 */
    #define S_IRUSR 0000400  /* 읽기 권한의 소유자 */
    #define S_IWUSR 0000200  /* 기입 권한의 소유자 */
    #define S_IXUSR 0000100  /* 실행/검색 권한의 소유자 */

액세스 모드의 리스트에 대해서는, <sys/stat.h>, access(2), chmod(2) (을)를 참조해 주세요.

반환값

호환성
이전의 버젼의 시스템에서는, st_dev, st_uid, st_gid, st_rdev, st_size, st_blksize, st_blocks 필드에 다른 타입을 사용하고 있었습니다.

에러
stat() (와)과 lstat() (은)는, 이하와 같은 경우에 에러가 됩니다.

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

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

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

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

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

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

[EIO]
    파일 시스템에서의 읽고 쓰기중에 입출력 에러가 발생했습니다.

fstat() (은)는, 이하와 같은 경우에 에러가 됩니다.

[EBADF]
    fd 하지만, 유효한 기술자가 아닙니다.

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

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

관련 항목
access(2), chmod(2), chown(2), utimes(2), symlink(7)

버그
fstat() (을)를 소켓 ( 및 파이프)에 적용하면(자), 블록 사이즈 필드, 및 고유 디바이스와 inode 번호 이외에 0 이 들어간 버퍼가 되돌려집니다.

표준
stat() 함수 호출과 fstat() 함수 호출은, p1003.1-90 에 준거하고 있습니다.

역사
stat() 함수 호출과 fstat() 함수 호출은, AT&T UNIX 그리고 등장했습니다. lstat() 함수 호출은 4.2BSD 그리고 등장했습니다.