Provided by:
manpages-ko_20050219-2_all 
#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),와 trun-
cate(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 영역을 위해 정의된 것이다:
l l l. S_IFMT 0170000 bitmask for the file type bitfields
S_IFSOCK 0140000 socket S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file S_IFBLK 0060000 block device
S_IFDIR 0040000 directory S_IFCHR 0020000 character device
S_IFIFO 0010000 fifo S_ISUID 0004000 set UID bit
S_ISGID 0002000 set GID bit (see below) S_ISVTX 0001000 sticky
bit (see below) S_IRWXU 00700 mask for file owner permissions
S_IRUSR 00400 owner has read permission S_IWUSR 00200 owner
has write permission S_IXUSR 00100 owner has execute permission
S_IRWXG 00070 mask for group permissions
S_IRGRP 00040 group has read permission S_IWGRP 00020 group
has write permission S_IXGRP 00010 group has execute permission
S_IRWXO 00007 mask for permissions for others (not in group)
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permisson
S_IXOTH 00001 others have execute permission
GID 비트 (S_ISGID)설정은 몇가지 특별한 이용법이 있다: 디렉토리의 경우
BSD semantic이 쓰이고 있음이 나타낫 생성된 파일은 생성 프로세스와
생성된 디렉토리의 유효한 gid로부터가 아니라 디렉토리로부터 그들의 그룹
ID를 상속받는다. 그리고 S_ISGID 비트군을 가진다. 실행
비트(S_IXGRP)군을 갖지 않은 파일의 경우, mandatory file/record lock-
ing을 나타낸다.
디렉토리 상의 `sticky' bit (S_ISVTX)는 디렉토리안의 파일이 파일의
소유자, 디렉토리의 소유자, 그리고 루트에 의해 이름을 바뀌거나 지워질 수
있다는 것을 뜻한다.
값으로 설정된다.
ENOENT A component of the path file_name 경로의 구성요소가 존재하지
않거나 경로가 빈 문자오甄
ENOTDIR
경로의 구성요소가 디렉토리가 아니다.
ELOOP 심볼릭링크가 너무 많다.
EFAULT 잘못된 주소이다.
EACCES 권한이 거부됐다.
ENOMEM 메모리 부족.
ENAMETOOLONG
파일명이 너무 길다.
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를
갖는다.
l l l l l. hex 이름 ls octal 설명
f000 S_IFMT 170000 파일타입을 위한 mask
0000 000000 SCO out-of-service inode, BSD unknown type
SVID-v2 and XPG2 have both 0 and 0100000 for ordi-
nary file 1000 S_IFIFO p| 010000 fifo (named pipe)
2000 S_IFCHR c 020000 character special (V7)
3000 S_IFMPC 030000 multiplexed character special (V7)
4000 S_IFDIR d/ 040000 directory (V7)
5000 S_IFNAM 050000 XENIX named special file
with two subtypes, distinguished by st_rdev values
1, 2: 0001 S_INSEM s 000001 XENIX semaphore subtype of IFNAM
0002 S_INSHD m 000002 XENIX shared data subtype of IFNAM
6000 S_IFBLK b 060000 block special (V7)
7000 S_IFMPB 070000 multiplexed block special (V7)
8000 S_IFREG - 100000 regular (V7)
9000 S_IFCMP 110000 VxFS compressed
9000 S_IFNWK n 110000 network special (HP-UX)
a000 S_IFLNK l@ 120000 symbolic link (BSD)
b000 S_IFSHAD 130000 Solaris shadow inode for ACL (not seen by
userspace) c000 S_IFSOCK s= 140000 socket (BSD; also "S_IFSOC" on
VxFS) d000 S_IFDOOR D 150000 Solaris door
e000 S_IFWHT w% 160000 BSD whiteout (not used for inode)
0200 S_ISVTX 001000 `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) 0400 S_ISGID 002000 set group ID on execution (V7)
for directories: use BSD semantics for propagation
of gid 0400 S_ENFMT 002000 SysV file locking enforcement
(shared w/ S_ISGID) 0800 S_ISUID 004000 set user ID on execu-
tion (V7) 0800 S_CDF 004000 directory is a context depen-
dent file (HP-UX)
sticky 명령은 AT&T UNIX V32에선보였다.