stat(2) - wariua/manpages-ko GitHub Wiki

NAME

stat, fstat, lstat, fstatat - 파일 μƒνƒœ 정보 μ–»κΈ°

SYNOPSIS

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

int stat(const char *pathname, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);

#include <fcntl.h>           /* AT_* μƒμˆ˜ μ •μ˜ */
#include <sys/stat.h>

int fstatat(int dirfd, const char *pathname, struct stat *statbuf,
            int flags);

glibc κΈ°λŠ₯ 확인 맀크둜 μš”κ±΄ (feature_test_macros(7) μ°Έκ³ ):

lstat():
/* glibc 2.19 및 이전: */ _BSD_SOURCE
|| /* glibc 2.20λΆ€ν„° */ _DEFAULT_SOURCE
|| _XOPEN_SOURCE >= 500
|| /* glibc 2.10λΆ€ν„°: */ _POSIX_C_SOURCE >= 200112L
fstatat():
glibc 2.10λΆ€ν„°:
_POSIX_C_SOURCE >= 200809L
glibc 2.10 μ „:
_ATFILE_SOURCE

DESCRIPTION

이 ν•¨μˆ˜λ“€μ€ νŒŒμΌμ— λŒ€ν•œ 정보λ₯Ό statbufκ°€ κ°€λ¦¬ν‚€λŠ” λ²„νΌλ‘œ λ°˜ν™˜ν•œλ‹€. κ·Έ 파일 μžμ²΄μ— λŒ€ν•΄μ„  μ–΄λ–€ κΆŒν•œλ„ ν•„μš”μΉ˜ μ•Šμ§€λ§Œ (stat(), fstatat(), lstat()μ—μ„œλŠ”) pathnameμ—μ„œ κ·Έ νŒŒμΌκΉŒμ§€ μ΄μ–΄μ§€λŠ” 디렉터리 λͺ¨λ‘μ— λŒ€ν•΄ μ‹€ν–‰(탐색) κΆŒν•œμ΄ ν•„μš”ν•˜λ‹€.

stat()κ³Ό fstatat()은 pathname이 κ°€λ¦¬ν‚€λŠ” νŒŒμΌμ— λŒ€ν•œ 정보λ₯Ό κ°€μ Έμ˜¨λ‹€. fstatat()의 차이점을 μ•„λž˜μ—μ„œ μ„€λͺ…ν•œλ‹€.

lstat()은 stat()κ³Ό λ™μΌν•˜λ˜ pathname이 심볼릭 링크인 κ²½μš°μ—λŠ” λŒ€μƒ 파일이 μ•„λ‹ˆλΌ 링크 μžμ²΄μ— λŒ€ν•œ 정보λ₯Ό λ°˜ν™˜ν•œλ‹€.

fstat()은 stat()κ³Ό λ™μΌν•˜λ˜ μ–΄λ–€ νŒŒμΌμ— λŒ€ν•œ 정보λ₯Ό κ°€μ Έμ˜¬μ§€λ₯Ό 파일 λ””μŠ€ν¬λ¦½ν„° fd둜 μ§€μ •ν•œλ‹€.

stat ꡬ쑰체

이 μ‹œμŠ€ν…œ ν˜ΈμΆœλ“€μ€ λͺ¨λ‘ stat ꡬ쑰체λ₯Ό λ°˜ν™˜ν•˜λŠ”λ°, μ΄λŠ” λ‹€μŒ ν•„λ“œλ“€μ„ λ‹΄κ³  μžˆλ‹€.

struct stat {
    dev_t     st_dev;         /* νŒŒμΌμ„ 담은 μž₯치의 ID */
    ino_t     st_ino;         /* μ•„μ΄λ…Έλ“œ 번호 */
    mode_t    st_mode;        /* 파일 μ’…λ₯˜ 및 λͺ¨λ“œ */
    nlink_t   st_nlink;       /* ν•˜λ“œ 링크 수 */
    uid_t     st_uid;         /* μ†Œμœ μžμ˜ μ‚¬μš©μž ID */
    gid_t     st_gid;         /* μ†Œμœ μžμ˜ κ·Έλ£Ή ID */
    dev_t     st_rdev;        /* μž₯치 ID (특수 파일인 경우) */
    off_t     st_size;        /* 총 크기, λ°”μ΄νŠΈ λ‹¨μœ„ */
    blksize_t st_blksize;     /* 파일 μ‹œμŠ€ν…œ I/O의 블둝 크기 */
    blkcnt_t  st_blocks;      /* ν• λ‹Ήλœ 512B 블둝 수 */

    /* λ¦¬λˆ…μŠ€ 2.6λΆ€ν„° μ»€λ„μ—μ„œ λ‹€μŒ νƒ€μž„μŠ€νƒ¬ν”„ ν•„λ“œλ“€μ—
       λ‚˜λ…Έμ΄ˆ 정밀도λ₯Ό μ§€μ›ν•œλ‹€. λ¦¬λˆ…μŠ€ 2.6 전에 λŒ€ν•œ
       λ‚΄μš©μ€ NOTES μ°Έκ³ . */

    struct timespec st_atim;  /* 졜근 μ ‘κ·Ό μ‹œκ°„ */
    struct timespec st_mtim;  /* 졜근 μˆ˜μ • μ‹œκ°„ */
    struct timespec st_ctim;  /* 졜근 μƒνƒœ λ³€κ²½ μ‹œκ°„ */

#define st_atime st_atim.tv_sec      /* ν•˜μœ„ ν˜Έν™˜μ„± */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};

주의: stat ꡬ쑰체 λ‚΄ ν•„λ“œ μˆœμ„œκ°€ μ•„ν‚€ν…μ²˜μ— 따라 μ•½κ°„ λ‹€λ₯΄λ‹€. λ”λΆˆμ–΄ μœ„ μ •μ˜μ—λŠ” μ—¬λŸ¬ μ•„ν‚€ν…μ²˜μ—μ„œ 일뢀 ν•„λ“œλ“€ 사이에 μžˆλŠ” νŒ¨λ”© λ°”μ΄νŠΈκ°€ λ‚˜μ™€ μžˆμ§€ μ•Šλ‹€. μžμ„Έν•œ λ‚΄μš©μ„ μ•Œ ν•„μš”κ°€ μžˆλ‹€λ©΄ glibc 및 컀널 μ†ŒμŠ€ μ½”λ“œλ₯Ό 확인해 보라.

주의: μ„±λŠ₯κ³Ό λ‹¨μˆœμ„±μ„ μœ„ν•΄ stat ꡬ쑰체의 ν•„λ“œλ“€μ΄ μ‹œμŠ€ν…œ 호좜 μ‹€ν–‰ μ€‘μ˜ μƒμ΄ν•œ μ‹œμ μ˜ μƒνƒœ 정보λ₯Ό 담을 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ—μ„œ chmod(2)λ‚˜ chown(2)을 ν˜ΈμΆœν•΄μ„œ st_modeλ‚˜ st_uidλ₯Ό λ°”κΎΈλŠ” κ²½μš°μ— stat()이 이전 st_mode와 μƒˆ st_uidλ₯Ό λ°˜ν™˜ν•  μˆ˜λ„ 있고 이전 st_uid와 μƒˆ st_modeλ₯Ό λ°˜ν™˜ν•  μˆ˜λ„ μžˆλ‹€.

stat ꡬ쑰체의 ν•„λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

st_dev
이 ν•„λ“œλŠ” 이 파일이 μœ„μΉ˜ν•œ μž₯치λ₯Ό κΈ°μˆ ν•œλ‹€. (이 ν•„λ“œμ˜ μž₯치 IDλ₯Ό λΆ„ν•΄ν•˜λŠ” 데 major(3) 및 minor(3) λ§€ν¬λ‘œκ°€ μœ μš©ν•  수 μžˆλ‹€.)
st_ino
이 ν•„λ“œλŠ” 파일의 μ•„μ΄λ…Έλ“œ 번호λ₯Ό λ‹΄λŠ”λ‹€.
st_mode
이 ν•„λ“œλŠ” 파일 μ’…λ₯˜μ™€ λͺ¨λ“œλ₯Ό λ‹΄λŠ”λ‹€. μžμ„Έν•œ λ‚΄μš©μ€ inode(7) μ°Έκ³ .
st_nlink
이 ν•„λ“œλŠ” νŒŒμΌμ— λŒ€ν•œ ν•˜λ“œ 링크 수λ₯Ό λ‹΄λŠ”λ‹€.
st_uid
이 ν•„λ“œλŠ” 파일 μ†Œμœ μžμ˜ μ‚¬μš©μž IDλ₯Ό λ‹΄λŠ”λ‹€.
st_gid
이 ν•„λ“œλŠ” 파일 κ·Έλ£Ή μ†Œμœ μžμ˜ IDλ₯Ό λ‹΄λŠ”λ‹€.
st_rdev
이 ν•„λ“œλŠ” 이 파일이 (μ•„μ΄λ…Έλ“œκ°€) λ‚˜νƒ€λ‚΄λŠ” μž₯치λ₯Ό κΈ°μˆ ν•œλ‹€.
st_size
이 ν•„λ“œλŠ” (μ •κ·œ νŒŒμΌμ΄λ‚˜ 심볼릭 링크인 경우) λ°”μ΄νŠΈ λ‹¨μœ„ 파일 크기λ₯Ό μ•Œλ € μ€€λ‹€. 심볼릭 링크의 ν¬κΈ°λž€ λ‹΄κ³  μžˆλŠ” (μ’…λ£Œ 널 λ°”μ΄νŠΈ μ—†λŠ”) 경둜λͺ…μ˜ 길이닀.
st_blksize
이 ν•„λ“œλŠ” 효율적인 파일 μ‹œμŠ€ν…œ I/Oλ₯Ό μœ„ν•œ "μ„ ν˜Έ" 블둝 크기λ₯Ό μ•Œλ € μ€€λ‹€.
st_blocks
이 ν•„λ“œλŠ” νŒŒμΌμ— ν• λ‹Ήλœ 512λ°”μ΄νŠΈ λ‹¨μœ„ 블둝 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. (νŒŒμΌμ— ꡬ멍이 μžˆμ„ λ•ŒλŠ” st_size/512보닀 μž‘μ„ μˆ˜λ„ μžˆλ‹€.
st_atime
파일의 졜근 μ ‘κ·Ό νƒ€μž„μŠ€νƒ¬ν”„λ‹€.
st_mtime
파일의 졜근 μˆ˜μ • νƒ€μž„μŠ€νƒ¬ν”„λ‹€.
st_ctime
파일의 졜근 μƒνƒœ λ³€κ²½ νƒ€μž„μŠ€νƒ¬ν”„λ‹€.

μœ„ ν•„λ“œλ“€μ— λŒ€ν•œ 더 μžμ„Έν•œ λ‚΄μš©μ€ inode(7)λ₯Ό 보라.

fstatat()

fstatat() μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ 파일 정보에 μ ‘κ·Όν•˜κΈ° μœ„ν•œ λ²”μš©μ  μΈν„°νŽ˜μ΄μŠ€λ‘œ stat(), lstat(), fstat() 각각의 λ™μž‘ λ°©μ‹κΉŒμ§€ μ •ν™•ν•˜κ²Œ μ œκ³΅ν•  수 μžˆλ‹€.

pathname에 μ€€ 경둜λͺ…이 μƒλŒ€ 경둜이면 (μƒλŒ€ 경둜λͺ…에 λŒ€ν•΄ stat() 및 lstat()μ—μ„œ ν•˜λ“― 호좜 ν”„λ‘œμ„ΈμŠ€μ˜ ν˜„μž¬ μž‘μ—… 디렉터리λ₯Ό κΈ°μ€€μœΌλ‘œ ν•˜λŠ” 게 μ•„λ‹ˆλΌ) 파일 λ””μŠ€ν¬λ¦½ν„° dirfdκ°€ κ°€λ¦¬ν‚€λŠ” 디렉터리λ₯Ό κΈ°μ€€μœΌλ‘œ 경둜λͺ…을 ν•΄μ„ν•œλ‹€.

pathname이 μƒλŒ€ 경둜이고 dirfdκ°€ 특수 κ°’ AT_FDCWD이면 (stat() 및 lstat()처럼) 호좜 ν”„λ‘œμ„ΈμŠ€μ˜ ν˜„μž¬ μž‘μ—… 디렉터리λ₯Ό κΈ°μ€€μœΌλ‘œ pathname을 ν•΄μ„ν•œλ‹€.

pathname이 μ ˆλŒ€ 경둜이면 dirfdλ₯Ό λ¬΄μ‹œν•œλ‹€.

flagsλŠ” 0일 μˆ˜λ„ 있고 λ‹€μŒ ν”Œλž˜κ·Έλ₯Ό 1개 이상 OR ν•΄μ„œ 담을 μˆ˜λ„ μžˆλ‹€.

AT_EMPTY_PATH (λ¦¬λˆ…μŠ€ 2.6.39λΆ€ν„°)
pathname이 빈 λ¬Έμžμ—΄μ΄λ©΄ (open(2) O_PATH ν”Œλž˜κ·Έλ‘œ 얻은 것일 μˆ˜λ„ μžˆλŠ”) dirfdκ°€ κ°€λ¦¬ν‚€λŠ” νŒŒμΌμ— λŒ€ν•΄ λ™μž‘ν•œλ‹€. 이 κ²½μš°μ— dirfdλŠ” λ””λ ‰ν„°λ¦¬λ§Œμ΄ μ•„λ‹ˆλΌ μž„μ˜ μ’…λ₯˜μ˜ νŒŒμΌμ„ 가리킬 수 있으며 fstatat()의 λ™μž‘ 방식은 fstat()κ³Ό λΉ„μŠ·ν•˜λ‹€. dirfdκ°€ AT_FDCWD이면 ν˜„μž¬ μž‘μ—… 디렉터리에 λŒ€ν•΄ 호좜이 λ™μž‘ν•œλ‹€. 이 ν”Œλž˜κ·ΈλŠ” λ¦¬λˆ…μŠ€ μ „μš©μ΄λ‹€. 이 μ •μ˜λ₯Ό μ–»μœΌλ €λ©΄ _GNU_SOURCEλ₯Ό μ •μ˜ν•΄μ•Ό ν•œλ‹€.
AT_NO_AUTOMOUNT (λ¦¬λˆ…μŠ€ 2.6.38λΆ€ν„°)
pathname의 λ§ˆμ§€λ§‰ μš”μ†Œ("basename")κ°€ μžλ™ 마운트 지점인 디렉터리인 κ²½μš°μ— μžλ™ 마운트λ₯Ό ν•˜μ§€ μ•ŠλŠ”λ‹€. 이λ₯Ό 톡해 (마운트 될 μœ„μΉ˜κ°€ μ•„λ‹ˆλΌ) μžλ™ 마운트 μ§€μ μ˜ 속성듀을 ν˜ΈμΆœμžκ°€ 얻을 수 μžˆλ‹€. λ˜ν•œ λ¦¬λˆ…μŠ€ 4.14λΆ€ν„°λŠ” automounter κ°„μ ‘ λ§΅ 등에 μ“°μ΄λŠ” on-demand 디렉터리에 μ‹€μž¬ν•˜μ§€ μ•ŠλŠ” 이름을 λ§Œλ“€μ–΄ λ‚΄μ§€ μ•ŠλŠ”λ‹€. 디렉터리듀을 ν›‘λŠ” λ„κ΅¬λ“€μ—μ„œ 이 ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•΄μ„œ μžλ™ 마운트 지점인 디렉터리λ₯Ό μž”λœ© μžλ™ 마운트 ν•˜λŠ” κ±Έ λ°©μ§€ν•  수 μžˆλ‹€. 마운트 지점에 이미 λ§ˆμš΄νŠΈκ°€ 됐으면 AT_NO_AUTOMOUNT ν”Œλž˜κ·Έμ— 아무 효λ ₯이 μ—†λ‹€. 이 ν”Œλž˜κ·ΈλŠ” λ¦¬λˆ…μŠ€ μ „μš©μ΄λ‹€. 이 μ •μ˜λ₯Ό μ–»μœΌλ €λ©΄ _GNU_SOURCEλ₯Ό μ •μ˜ν•΄μ•Ό ν•œλ‹€. stat()κ³Ό lstat() λͺ¨λ‘ AT_NO_AUTOMOUNTκ°€ μ„€μ •λœ κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€.
AT_SYMLINK_NOFOLLOW
pathname이 심볼릭 링크인 경우 μ—­μ°Έμ‘°λ₯Ό ν•˜μ§€ μ•ŠλŠ”λ‹€. λŒ€μ‹  lstat()처럼 링크 μžμ²΄μ— λŒ€ν•œ 정보λ₯Ό λ°˜ν™˜ν•œλ‹€. (기본적으둜 fstatat()은 stat()처럼 심볼릭 링크λ₯Ό μ—­μ°Έμ‘° ν•œλ‹€.)

fstatat()의 ν•„μš”μ„±μ— λŒ€ν•œ μ„€λͺ…은 openat(2)을 보라.

RETURN VALUE

성곡 μ‹œ 0을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ μ‹œ -1을 λ°˜ν™˜ν•˜λ©° errnoλ₯Ό 적절히 μ„€μ •ν•œλ‹€.

ERRORS

EACCES
pathname의 경둜 μ„ λ‘λΆ€μ˜ ν•œ 디렉터리에 λŒ€ν•΄ 탐색 κΆŒν•œμ΄ κ±°λΆ€λ˜μ—ˆλ‹€. (path_resolution(7) μ°Έκ³ .)
EBADF
fdκ°€ μœ νš¨ν•œ μ—΄λ¦° 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ μ•„λ‹ˆλ‹€.
EFAULT
잘λͺ»λœ μ£Όμ†Œ.
ELOOP
경둜λͺ…을 μˆœνšŒν•˜λŠ” λ™μ•ˆ λ„ˆλ¬΄ λ§Žμ€ 심볼릭 링크λ₯Ό λ§Œλ‚¬λ‹€.
ENAMETOOLONG
pathname이 λ„ˆλ¬΄ κΈΈλ‹€.
ENOENT
pathname의 μ–΄λŠ μš”μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šκ±°λ‚˜ κΉ¨μ§„ 심볼릭 링크이닀.
ENOENT
pathname이 빈 λ¬Έμžμ—΄μΈλ° flags에 AT_EMPTY_PATHλ₯Ό μ§€μ •ν•˜μ§€ μ•Šμ•˜λ‹€.
ENOMEM
λ©”λͺ¨λ¦¬ (즉 컀널 λ©”λͺ¨λ¦¬) λΆ€μ‘±.
ENOTDIR
pathname의 경둜 μ„ λ‘λΆ€μ˜ μ–΄λŠ μš”μ†Œκ°€ 디렉터리가 μ•„λ‹ˆλ‹€.
EOVERFLOW
pathnameμ΄λ‚˜ fdκ°€ κ·Έ 크기, μ•„μ΄λ…Έλ“œ 번호, 블둝 수λ₯Ό 각기 off_t, ino_t, blkcnt_t νƒ€μž…μœΌλ‘œ ν‘œν˜„ν•  수 μ—†λŠ” νŒŒμΌμ„ 가리킀고 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ 32λΉ„νŠΈ ν”Œλž«νΌμ—μ„œ -D_FILE_OFFSET_BITS=64 없이 컴파일 ν•œ μ‘μš©μ΄ 크기가 (1<<31)-1 λ°”μ΄νŠΈλ₯Ό λ„˜λŠ” νŒŒμΌμ„ μ—΄λ €κ³  ν•˜λŠ” κ²½μš°μ— 이 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€.

fstatat()μ—μ„œ λ‹€μŒ 였λ₯˜λ“€μ΄ μΆ”κ°€λ‘œ λ°œμƒν•  수 μžˆλ‹€.

EBADF
dirfdκ°€ μœ νš¨ν•œ 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ μ•„λ‹ˆλ‹€.
EINVAL
flags에 μœ νš¨ν•˜μ§€ μ•Šμ€ ν”Œλž˜κ·Έλ₯Ό μ§€μ •ν–ˆλ‹€.
ENOTDIR
pathname이 μƒλŒ€ 경둜인데 dirfdκ°€ 디렉터리 μ•„λ‹Œ νŒŒμΌμ„ κ°€λ¦¬ν‚€λŠ” 파일 λ””μŠ€ν¬λ¦½ν„°μ΄λ‹€.

VERSIONS

λ¦¬λˆ…μŠ€ 컀널 2.6.16μ—μ„œ fstatat()이 μΆ”κ°€λ˜μ—ˆλ‹€. glibc 버전 2.4μ—μ„œ 라이브러리 지원이 μΆ”κ°€λ˜μ—ˆλ‹€.

CONFORMING TO

stat(), fstat(), lstat(): SVr4, 4.3BSD, POSIX.1-2001, POSIX.1-2008.

fstatat(): POSIX.1-2008.

POSIX.1-2001에 λ”°λ₯΄λ©΄ 심볼릭 링크에 lstat()을 ν•˜λ©΄ stat ꡬ쑰체의 st_size ν•„λ“œμ™€ st_mode ν•„λ“œμ˜ 파일 μ’…λ₯˜μ—λ§Œ μœ νš¨ν•œ 정보λ₯Ό λ°˜ν™˜ν•˜λ©΄ λœλ‹€. POSIX.1-2008μ—μ„œλŠ” λͺ…μ„Έλ₯Ό 더 κ°•ν™”ν•΄μ„œ lstat()이 st_mode의 λͺ¨λ“œ λΉ„νŠΈλ₯Ό μ œμ™Έν•œ λͺ¨λ“  ν•„λ“œλ“€μ— μœ νš¨ν•œ 정보λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ ν•œλ‹€.

st_blocks 및 st_blksize ν•„λ“œλ₯Ό μ“°λ©΄ 이식성이 μ’€ λ–¨μ–΄μ§ˆ μˆ˜λ„ μžˆλ‹€. (두 ν•„λ“œλŠ” BSDμ—μ„œ λ„μž…λλ‹€. μ‹œμŠ€ν…œμ— 따라 해석 방식이 λ‹€λ₯΄κ³ , NFS λ§ˆμš΄νŠΈκ°€ 있으면 단일 μ‹œμŠ€ν…œ λ‚΄μ—μ„œλ„ λ‹€λ₯Ό 수 μžˆλ‹€.)

NOTES

νƒ€μž„μŠ€νƒ¬ν”„ ν•„λ“œ

ꡬ식 컀널 및 ꡬ식 ν‘œμ€€μ—μ„œλŠ” λ‚˜λ…Έμ΄ˆ νƒ€μž„μŠ€νƒ¬ν”„ ν•„λ“œλ₯Ό μ§€μ›ν•˜μ§€ μ•Šμ•˜λ‹€. λŒ€μ‹  time_t νƒ€μž…μœΌλ‘œ νƒ€μž„μŠ€νƒ¬ν”„ ν•„λ“œ μ„Έ 개(st_atime, st_mtime, st_ctime)κ°€ μžˆμ–΄μ„œ 초 λ‹¨μœ„λ‘œ νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό κΈ°λ‘ν–ˆλ‹€.

컀널 2.5.48λΆ€ν„° stat ꡬ쑰체의 κ·Έ μ„Έ κ°€μ§€ νƒ€μž„μŠ€νƒ¬ν”„ ν•„λ“œμ—μ„œ λ‚˜λ…Έμ΄ˆ 해상도λ₯Ό μ§€μ›ν•œλ‹€. μ μ ˆν•œ κΈ°λŠ₯ 확인 λ§€ν¬λ‘œκ°€ μ •μ˜λΌ 있으면 각 νƒ€μž„μŠ€νƒ¬ν”„μ˜ λ‚˜λ…Έμ΄ˆ 뢀뢄을 st_atim.tv_nsec ν˜•νƒœμ˜ μ΄λ¦„μœΌλ‘œ μ“Έ 수 μžˆλ‹€. λ‚˜λ…Έμ΄ˆ νƒ€μž„μŠ€νƒ¬ν”„λŠ” POSIX.1-2008μ—μ„œ ν‘œμ€€ν™”λμœΌλ©°, glibc 버전 2.12λΆ€ν„° _POSIX_C_SOURCEκ°€ 200809L 이상 κ°’μœΌλ‘œ μ •μ˜λΌ μžˆκ±°λ‚˜ _XOPEN_SOURCEκ°€ 700 이상 κ°’μœΌλ‘œ μ •μ˜λΌ 있으면 λ‚˜λ…Έμ΄ˆ λΆ€λΆ„ 이름이 λ“œλŸ¬λ‚œλ‹€. glibc 2.19κΉŒμ§€μ—μ„œλŠ” _BSD_SOURCEλ‚˜ _SVID_SOURCEκ°€ μ •μ˜λΌ μžˆλŠ” κ²½μš°μ—λ„ λ‚˜λ…Έμ΄ˆ λΆ€λΆ„μ˜ μ •μ˜κ°€ λ“œλŸ¬λ‚œλ‹€. μ•žμ„œ μ–ΈκΈ‰ν•œ μ–΄λ–€ λ§€ν¬λ‘œλ„ μ •μ˜λΌ μžˆμ§€ μ•Šμ€ κ²½μš°μ—λŠ” st_atimensec ν˜•νƒœμ˜ μ΄λ¦„μœΌλ‘œ λ‚˜λ…Έμ΄ˆ 값듀을 μ“Έ 수 μžˆλ‹€.

C 라이브러리/컀널 차이

μ‹œκ°„μ΄ 흐λ₯΄λ©° stat ꡬ쑰체가 μ»€μ§€λ©΄μ„œ μ„Έ κ°€μ§€ stat() 버전이 생겼닀. i386 같은 32λΉ„νŠΈ ν”Œλž«νΌμ—μ„œ sys_stat() (슬둯 __NR_oldstat), sys_newstat() (슬둯 __NR_stat), 그리고 sys_stat64() (슬둯 __NR_stat64)이닀. 처음 두 버전은 (λ‹€λ₯Έ μ΄λ¦„μ΄κΈ°λŠ” ν–ˆμ§€λ§Œ) λ¦¬λˆ…μŠ€ 1.0에도 μžˆμ—ˆμœΌλ©°, λ§ˆμ§€λ§‰ 버전은 λ¦¬λˆ…μŠ€ 2.4μ—μ„œ 좔가됐닀. λΉ„μŠ·ν•œ λ‚΄μš©μ΄ fstat()κ³Ό lstat()에도 μ μš©λœλ‹€.

각 λ²„μ „μ—μ„œ λ‹€λ£¨λŠ” 컀널 λ‚΄λΆ€ stat ꡬ쑰체 버전은 λ‹€μŒκ³Ό κ°™λ‹€.

__old_kernel_stat
μ›λž˜ ꡬ쑰체. ν•„λ“œλ“€μ΄ μ’€ μž‘κ³  νŒ¨λ”© μ—†μŒ.
stat
st_ino ν•„λ“œκ°€ 컀지고 ν–₯ν›„ ν™•μž₯을 μœ„ν•΄ ꡬ쑰체 μ—¬λŸ¬ 뢀뢄에 νŒ¨λ”©μ΄ 좔가됨.
stat64
st_ino ν•„λ“œκ°€ 더 컀지고, λ¦¬λˆ…μŠ€ 2.4μ—μ„œ UID 및 GIDλ₯Ό 32λΉ„νŠΈλ‘œ ν™•μž₯ν•œ 것에 맞좰 st_uid 및 st_gid ν•„λ“œκ°€ 컀지고, μ—¬λŸ¬ λ‹€λ₯Έ ν•„λ“œλ“€μ΄ 더 컀지고 ꡬ쑰체에 νŒ¨λ”©λ“€μ΄ 좔가됨. (λ¦¬λˆ…μŠ€ 2.6μ—μ„œ 32λΉ„νŠΈ μž₯치 ID와 νƒ€μž„μŠ€νƒ¬ν”„ λ‚˜λ…Έμ΄ˆ 뢀뢄이 λ“±μž₯ν•˜λ©΄μ„œ μ—¬λŸ¬ νŒ¨λ”© λ°”μ΄νŠΈκ°€ μ‚¬λΌμ‘Œλ‹€.)

glibc의 stat() 래퍼 ν•¨μˆ˜μ—μ„œ 이런 μ„ΈλΆ€ 사항을 μ‘μš©μ—κ²Œ 감좰 μ£Όκ³  컀널이 μ œκ³΅ν•˜λŠ” κ°€μž₯ μ΅œμ‹  λ²„μ „μ˜ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ λΆ€λ₯΄λ©° ꡬ식 λ°”μ΄λ„ˆλ¦¬λ₯Ό μœ„ν•΄ ν•„μš”ν•œ 경우 λ°˜ν™˜λœ 정보λ₯Ό λ‹€μ‹œ 포μž₯ν•΄ μ€€λ‹€.

μ΅œμ‹  64λΉ„νŠΈ μ‹œμŠ€ν…œμ—μ„œλŠ” κ°„λ‹¨ν•˜λ‹€. stat() μ‹œμŠ€ν…œ 호좜이 ν•˜λ‚˜λ§Œ 있고 μ»€λ„μ—μ„œλŠ” ν•„λ“œ 크기가 μΆ©λΆ„νžˆ 큰 stat ꡬ쑰체λ₯Ό μ‚¬μš©ν•œλ‹€.

glibc의 fstatat() 래퍼 ν•¨μˆ˜μ—μ„œ μ΄μš©ν•˜λŠ” 기반 μ‹œμŠ€ν…œ 호좜의 μ‹€μ œ 이름이 fstatat64()이고 일뢀 μ•„ν‚€ν…μ²˜μ—μ„œλŠ” newfstatat()이닀.

EXAMPLE

λ‹€μŒ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” lstat()을 ν˜ΈμΆœν•΄μ„œ λ°˜ν™˜λœ stat ꡬ쑰체의 μ£Όμš” ν•„λ“œλ“€μ„ ν‘œμ‹œν•œλ‹€.

#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/sysmacros.h>

int
main(int argc, char *argv[])
{
    struct stat sb;

    if (argc != 2) {
        fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    if (lstat(argv[1], &sb) == -1) {
        perror("lstat");
        exit(EXIT_FAILURE);
    }

    printf("ID of containing device:  [%lx,%lx]\n",
         (long) major(sb.st_dev), (long) minor(sb.st_dev));

    printf("File type:                ");

    switch (sb.st_mode & S_IFMT) {
    case S_IFBLK:  printf("block device\n");            break;
    case S_IFCHR:  printf("character device\n");        break;
    case S_IFDIR:  printf("directory\n");               break;
    case S_IFIFO:  printf("FIFO/pipe\n");               break;
    case S_IFLNK:  printf("symlink\n");                 break;
    case S_IFREG:  printf("regular file\n");            break;
    case S_IFSOCK: printf("socket\n");                  break;
    default:       printf("unknown?\n");                break;
    }

    printf("I-node number:            %ld\n", (long) sb.st_ino);

    printf("Mode:                     %lo (octal)\n",
            (unsigned long) sb.st_mode);

    printf("Link count:               %ld\n", (long) sb.st_nlink);
    printf("Ownership:                UID=%ld   GID=%ld\n",
            (long) sb.st_uid, (long) sb.st_gid);

    printf("Preferred I/O block size: %ld bytes\n",
            (long) sb.st_blksize);
    printf("File size:                %lld bytes\n",
            (long long) sb.st_size);
    printf("Blocks allocated:         %lld\n",
            (long long) sb.st_blocks);

    printf("Last status change:       %s", ctime(&sb.st_ctime));
    printf("Last file access:         %s", ctime(&sb.st_atime));
    printf("Last file modification:   %s", ctime(&sb.st_mtime));

    exit(EXIT_SUCCESS);
}

SEE ALSO

ls(1), stat(1), access(2), chmod(2), chown(2), readlink(2), statx(2), utime(2), capabilities(7), inode(7), symlink(7)


2019-03-06

⚠️ **GitHub.com Fallback** ⚠️