stat() 관련 함수

System Program/I/O 2014. 2. 26. 13:25

1. 시스템 함수들

 

stat(), lstat(), fstat() 시스템 함수들을 정리한다.

이 함수들은 파일에 대한 유용한 정보를 추출해 준다.

 

2. 정의들

 

#include <sys/stat.h>

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() 함수는 파일 경로 정보 대신 열린파일 디스크립터를 입력으로 받는 차이점이 있다.  

 

struct stat{
    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
: