stat() 관련 함수
System Program/I/O 2014. 2. 26. 13:251. 시스템 함수들
stat(), lstat(), fstat() 시스템 함수들을 정리한다.
이 함수들은 파일에 대한 유용한 정보를 추출해 준다.
2. 정의들
int stat(const char *pathname, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);
성공하면 '0'을 리턴하고, 에러가 발생하면 '-1'을 리턴
위의 함수는 아래의 구조체를 통해서 정보를 리턴한다.
기본 구조는 stat()에서 출발하고 lstat() 함수는 파일이 심볼릭 링크인 경우를
fstat() 함수는 파일 경로 정보 대신 열린파일 디스크립터를 입력으로 받는 차이점이 있다.
dev_t st_dev; /* 파일이 위치한 디바이스 ID */
ino_t st_ino; /* 파일의 i-노드 수 */
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; /* 파일의 전체 크기 (BYTE) */
blksize_t st_blksize; /* I/O의 최적 블록크기 (바이트) */
blkcnt_t st_blocks; /* 할당된 블록의 수(512B) */
time_t st_atime; /* 마지막 파일 접근 시간 */
time_t st_mtime; /* 마지막 파일 수정 시간 */
time_t st_ctime; /* 마지막 상태 변경 시간 */
};
3. struct stat 구조체로부터 정보 추출
3.1. dev_t st_dev 정보
디바이스의 major/minor가 합쳐져 있는 구조로 major()/minor()함수를 통해서 각각 원하는 값을 추출할 수 있다.
3.2. mode_t st_mode 정보 (가장 복잡하다)
st_mode와 아래 매크로와 AND 연산을 수행하여 추출한다.
[파일 종류 검사 매크로]
상수 |
테스트 매크로 |
설명 |
S_IFREG |
S_ISREG() |
일반파일 검사 |
S_IFDIR |
S_ISDIR() |
디렉토리 검사 |
S_IFCHR |
S_ISCHR() |
문자 디바이스 검사 |
S_IFBLK |
S_ISBLK() |
블록 디바이스 검사 |
S_IFIFO |
S_ISFIFO() |
FIFO나 파이프 검사 |
S_IFSOCK |
S_ISSOCK() |
소켓 검사 |
S_IFLNK |
S_ISLNK() |
심볼릭 링크 파일 검사 |
[파일 권한 비트 검사] {set-user-ID,set_group-ID.Sticky}/소유자/그룹/기타
상수 |
8진수 |
권한비트 |
S_ISUID |
04000 |
set-user-ID |
S_ISGID |
02000 |
set-group-ID |
S_ISVTX |
01000 |
스티키 |
S_IRUSR |
0400 |
사용자-읽기 |
S_IWUSR |
0200 |
사용자-쓰기 |
S_IXUSR |
0100 |
사용자-실행 |
S_IRGRP |
040 |
그룹-읽기 |
S_IWGRP |
020 |
그룹-쓰기 |
S_IXGRP |
010 |
그룹-실행 |
S_IROTH |
04 |
기타-읽기 |
S_IWOTH |
02 |
기타-쓰기 |
S_IXOTH |
01 |
기타-실행 |
추가적으로 사용자/그룹/기타 각각에 대해서 모든 권한이 설정되었는지 여부를 검사하는 아래 매크로도 있다.
S_IRWXU(0700), S_IRWXG(070), S_IRWXO(07)
4. 예제
/* * main.c -- C Test App. * * Copyright (C) 2012-2013, 2013 heesoon.kim <chipmaker.tistory.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/stat.h> #include <sys/types.h> #include <time.h> int main(int argc, char *argv[]) { time_t t; struct stat statbuf; if(stat("./main.c", &statbuf) == -1) { perror("fopen"); exit(EXIT_FAILURE); } // major/minor number print printf("major = %ld\n", major(statbuf.st_dev)); printf("minor = %ld\n", minor(statbuf.st_dev)); // file total size print printf("file size = %ld \n", statbuf.st_size); // file modify time print t = statbuf.st_mtime; printf("%s\n", ctime(&t)); // file mode check, the macro is defined to <sys/stat.h> //if((statbuf.st_mode & S_IFMT) == S_IFREG) if(S_ISREG(statbuf.st_mode)) printf("regular file\n"); exit(EXIT_SUCCESS); }
'System Program > I/O' 카테고리의 다른 글
고급 I/O 모델 : poll() 함수 (0) | 2014.03.12 |
---|---|
고급 I/O 모델 : select() 시스템 호출 (0) | 2014.03.01 |
access() 함수 (0) | 2014.02.26 |
fcntl() 함수 (0) | 2014.02.21 |
파일 I/O: 범용 I/O 모델 (0) | 2013.10.10 |