반응형
stat(2), lstat(2), fstat(2) 함수 원형
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);
- 파일 이름 또는 파일 디스크립터를 입력으로 받아 해당 파일의 정보를 얻는 함수입니다.
- man 페이지에서 확인하기 위해선 "man 2 stat"을 사용해야 stat(2) 내용을 확인할 수 있습니다.
- stat() : symbolic link 파일을 입력으로 받으면 원본 파일의 정보를 확일할 수 있습니다.
- lstat() : symbolic link 파일을 입력으로 받으면 해당 파일의 정보를 확일할 수 있습니다.
- fstat() : 파일 디스크립터를 입력으로 받 해당 파일의 정보를 확일할 수 있습니다.
파라미터
- pathname
- 정보를 얻고자 하는 파일의 절대 경로 또는 상대 경로
- fd
- 정보를 얻고자 하는 파일의 파일 디스크립터
- statbuf
- 파일의 정보를 저장할 구조체
struct stat { dev_t st_dev; /* 디바이스 번호 */ ino_t st_ino; /* inode 번호 */ mode_t st_mode; /* 파일의 종류 및 접근권한 */ nlink_t st_nlink; /* hardlink 된 횟수 */ uid_t st_uid; /* 소유자의 사용자 아이디 */ gid_t st_gid; /* 소유자의 그룹 아이디 */ dev_t st_rdev; /* 디바이스 아이디 (특수 파일인 경우) */ off_t st_size; /* 파일의 크기(bytes) */ blksize_t st_blksize; /* 블록 크기 */ blkcnt_t st_blocks; /* 512바이트 블록 갯수 */ time_t st_atime; /* 최종 접근 시간 */ time_t st_mtime; /* 최종 수정 시간 */ time_t st_ctime; /* 최종 상태 변경 시간 */ };
- st_mode와 매크로
S_ISREG(statbuf.st_mode) : 일반 파일 여부 S_ISDIR(statbuf.st_mode) : 디렉토리 여부 S_ISCHR(statbuf.st_mode) : character device 여부 S_ISBLK(statbuf.st_mode) : block device 여부 S_ISFIFO(statbuf.st_mode) : FIFO 여부 S_ISLNK(statbuf.st_mode) : symbolic link 여부 S_ISSOCK(statbuf.st_mode) : socket 여부 S_IFMT : 파일 유형의 전체의 비트 마스크 값 S_IFSOCK : 소켓 S_IFLNK : 심볼릭 링크 S_IFREG : 일반 파일 S_IFBLK : 블록 디바이스 S_IFDIR : 디렉터리 파일 S_IFCHR : 문자 디바이스 S_IFIFO : FIFO, Pipe 파일
- 파일의 정보를 저장할 구조체
반환값
- 0 : 성공
- -1 : 실패, 오류 내용은 errno 전역 변수에 설정됩니다.
예제
- sample
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <time.h> #include <errno.h> int showFileInfo(const char *pathname) { struct stat st; if (0 != stat(pathname, &st)) { printf("파일 정보 획득 실패 [%s]\n", strerror(errno)); return -1; } printf("파일 타입 : "); 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-노드 번호 : %ld\n", (long) sb.st_ino); printf("접근 권한 : %lo (octal)\n", (unsigned long) sb.st_mode); printf("하드링크 수 : %ld\n", (long) sb.st_nlink); printf("소유자 : UID=%ld GID=%ld\n", (long) sb.st_uid, (long) sb.st_gid); printf("블록 크기 : %ld bytes\n", (long) sb.st_blksize); printf("파일 크기 : %lld bytes\n", (long long) sb.st_size); printf("블록 개수 : %lld\n", (long long) sb.st_blocks); printf("마지막 상태 변경 시간 : %s", ctime(&sb.st_ctime)); printf("마지막 접근 시간 : %s", ctime(&sb.st_atime)); printf("마지막 수정 시간 : %s", ctime(&sb.st_mtime)); return 0; } int main(int argc, char **argv) { showFileInfo("./sample_file"); return 0; }
반응형
'C' 카테고리의 다른 글
[C/C++] mkdir(2) 디렉터리 생성 함수 사용법 (0) | 2024.03.08 |
---|---|
[C] Linux에서 System Log 사용 방법(openlog, syslog, closelog) (0) | 2023.11.10 |
[C/C++]임시 변수 없이 두 개의 정수 값을 교환하기 (2) | 2023.11.08 |
[C]Type Casting (0) | 2018.01.11 |
[C]변수 const (0) | 2018.01.11 |