STAT

Section: System calls (2)
Updated: May 13, 1998
Index
Return to Main Contents
 

이름

stat, fstat, lstat - 파일 상태를 얻는다  

사용법

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *file_name, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *file_name, struct stat *buf);  

설명

이 함수는 지정된 파일에 대한 정보를 반환한다. 이 정보를 얻기 위해 필요한 접근 권한은 없지만, 파일을 읽는 경로에 있는 모든 디렉토리에 대한 탐색 권한이 필요하다.

stat 는 file_name 으로 지정된 파일에 대해 설명하고 buf 에 채운다. lstat 는 stat 와 동일시된다.링크는 그 자체로 설명된다, 링크에 포함되어 있는 파일을 설명하지 않는다. fstat 는 stat와 동일시된다. file_name. 대신에 filedes 에 의해 지정된 열린 파일만 ( open(2) 에 의해 반환되듯이) 설명된다.

그것들은 모두 아래 영역을 포함하는 stat 구조을 반환한다:

struct stat
{
    dev_t         st_dev;      /* device */
    ino_t         st_ino;      /* inode */
    mode_t        st_mode;     /* protection */
    nlink_t       st_nlink;    /* number of hard links */
    uid_t         st_uid;      /* user ID of owner */
    gid_t         st_gid;      /* group ID of owner */
    dev_t         st_rdev;     /* device type (if inode device) */
    off_t         st_size;     /* total size, in bytes */
    unsigned long st_blksize;  /* blocksize for filesystem I/O */
    unsigned long st_blocks;   /* number of blocks allocated */
    time_t        st_atime;    /* time of last access */
    time_t        st_mtime;    /* time of last modification */
    time_t        st_ctime;    /* time of last change */
};

The value st_blocks 값은 512-bytes 블록에 있는 파일의 크기를 준다. st_blksize 값은 효율적인 파일 시스템 I/O를 위해 "선택된" 블록 크기를 준다. (더 작은 공간에 파일을 쓰는 것은 쓰고-수정하고-다시 쓰는데 비효율적이다.)4

모든 리눅스 파일시스템이 모든 시간 영역에서 실행하는 것은 아니다. 전통적으로, st_atime 는 mknod(2), utime(2), read(2), write(2),와 truncate(2). 로 바뀌었다. 전통적으로, st_mtime 는 mknod(2), utime(2),와 write(2). 로 바뀌었다. st_mtime 는 소유자, 그룹, 하드링크 카운트, 혹은 모드의 변화에 따라 바뀌지 않았다. 전통적으로, st_ctime 는 inode 정보를 쓰거나 설정함으로써 바뀌었다.(i.e., owner, group,link count, mode,등등).

아래 POSIX 매크로는 파일 타입을 확인하는 것이다:

S_ISLNK(m)
is it a symbolic link?
S_ISREG(m)
regular file?
S_ISDIR(m)
directory?
S_ISCHR(m)
character device?
S_ISBLK(m)
block device?
S_ISFIFO(m)
fifo?
S_ISSOCK(m)
socket?

아래 flag는 st_mode 영역을 위해 정의된 것이다:
S_IFMT0170000bitmask for the file type bitfields
S_IFSOCK0140000socket
S_IFLNK0120000symbolic link
S_IFREG0100000regular file
S_IFBLK0060000block device
S_IFDIR0040000directory
S_IFCHR0020000character device
S_IFIFO0010000fifo
S_ISUID0004000set UID bit
S_ISGID0002000set GID bit (see below)
S_ISVTX0001000sticky bit (see below)
S_IRWXU00700mask for file owner permissions
S_IRUSR00400owner has read permission
S_IWUSR00200owner has write permission
S_IXUSR00100owner has execute permission
S_IRWXG00070mask for group permissions
S_IRGRP00040group has read permission
S_IWGRP00020group has write permission
S_IXGRP00010group has execute permission
S_IRWXO00007mask for permissions for others (not in group)
S_IROTH00004others have read permission
S_IWOTH00002others have write permisson
S_IXOTH00001others have execute permission
GID 비트 (S_ISGID)설정은 몇가지 특별한 이용법이 있다: 디렉토리의 경우 BSD semantic이 쓰이고 있음이 나타난다: 생성된 파일은 생성 프로세스와 생성된 디렉토리의 유효한 gid로부터가 아니라 디렉토리로부터 그들의 그룹 ID를 상속받는다. 그리고 S_ISGID 비트군을 가진다. 실행 비트(S_IXGRP)군을 갖지 않은 파일의 경우, mandatory file/record locking을 나타낸다. 디렉토리 상의 `sticky' bit (S_ISVTX)는 디렉토리안의 파일이 파일의 소유자, 디렉토리의 소유자, 그리고 루트에 의해 이름을 바뀌거나 지워질 수 있다는 것을 뜻한다.  

반환값

성공시, 0이 반환되고, 실패시, -1이 반환된다. 그리고 errno 는 적절한 값으로 설정된다.  

에러

EBADF
filedes 는 잘못됐다.
ENOENT
A component of the path file_name 경로의 구성요소가 존재하지 않거나 경로가 빈 문자열이다.
ENOTDIR
경로의 구성요소가 디렉토리가 아니다.
ELOOP
심볼릭링크가 너무 많다.
EFAULT
잘못된 주소이다.
EACCES
권한이 거부됐다.
ENOMEM
메모리 부족.
ENAMETOOLONG
파일명이 너무 길다.
 

호환

stat 와 fstat 호출은 SVr4, SVID, POSIX, X/OPEN, BSD 4.3에 따른다. lstat 호출은 4.3BSD and SVr4에 따른다. SVr4는 추가적으로 documents additional fstat 에러 상태인 EINTR, ENOLINK, EOVERFLOW를 문서화했다. SVr4 는 추가적으로 stat 와 lstat 의 에러인 EACCES, EINTR, EMULTIHOP, ENOLINK, EOVERFLOW를 문서화했다. st_blocks 와 st_blksize 필드의 사용은 이식될 수 없다. (그것들은 POSIX에의해 지정된것이 아니고 BSD에서 소개되었다. 해석은 시스템마다 다르고, 싱글 시스템에서 NFS가 마운트되면 복잡해진다.)

POSIX은 S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX 비트에 대해 설명하지 않지만, 대신 S_ISDIR()등의 매크로 사용은 요구한다. 유닉스 V7 (이나 후의 시스템)은 POSIX에서 규정한 유사어인 S_IRUSR, S_IWUSR, S_IXUSR 의 S_IREAD, S_IWRITE, S_IEXEC를 갖는다.  

타 시스템

다양한 시스템에서 사용되는 값들:
hex이름lsoctal설명
f000S_IFMT170000파일타입을 위한 mask
0000000000SCO out-of-service inode, BSD unknown type
SVID-v2 and XPG2 have both 0 and 0100000 for ordinary file
1000S_IFIFOp|010000fifo (named pipe)
2000S_IFCHRc020000character special (V7)
3000S_IFMPC030000multiplexed character special (V7)
4000S_IFDIRd/040000directory (V7)
5000S_IFNAM050000XENIX named special file
with two subtypes, distinguished by st_rdev values 1, 2:
0001S_INSEMs000001XENIX semaphore subtype of IFNAM
0002S_INSHDm000002XENIX shared data subtype of IFNAM
6000S_IFBLKb060000block special (V7)
7000S_IFMPB070000multiplexed block special (V7)
8000S_IFREG-100000regular (V7)
9000S_IFCMP110000VxFS compressed
9000S_IFNWKn110000network special (HP-UX)
a000S_IFLNKl@120000symbolic link (BSD)
b000S_IFSHAD130000Solaris shadow inode for ACL (not seen by userspace)
c000S_IFSOCKs=140000socket (BSD; also "S_IFSOC" on VxFS)
d000S_IFDOORD150000Solaris door
e000S_IFWHTw%160000BSD whiteout (not used for inode)

0200S_ISVTX001000`sticky bit': save swapped text even after use (V7)
reserved (SVID-v2)
On non-directories: don't cache this file (SunOS)
On directories: restricted deletion flag (SVID-v4.2)
0400S_ISGID002000set group ID on execution (V7)
for directories: use BSD semantics for propagation of gid
0400S_ENFMT002000SysV file locking enforcement (shared w/ S_ISGID)
0800S_ISUID004000set user ID on execution (V7)
0800S_CDF004000directory is a context dependent file (HP-UX)
sticky 명령은 AT&T UNIX V32에서 선보였다.  

관련 항목

chmod(2), chown(2), readlink(2), utime(2)


 

Index

이름
사용법
설명
반환값
에러
호환
타 시스템
관련 항목

This document was created by man2html, using the manual pages.
Time: 08:07:01 GMT, March 25, 2004