yunsh206

회원가입로그인
http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/2/stathttp://www.joinc.co.kr/modules/moniwiki/wiki.php/article/FileInfo파일의 종류
Unix 에서는 디렉토리, 장치, 소켓, FIFO 등 모든것이 파일로 존재한다. 그러므로
우선 우리는 작업을 하고자 하는 파일이 어던 종류의 파일인지를 먼저 판단할수
있어야 한다. Unix 상에서 "ls -al" 을 이용하면 아래와 같은 결과물을 볼수
있을것이다.

[yundream@localhost test]# ls -al
...
-rw-r--r--    1 root     root          249  9월 10 11:25 wc.1
drwxr-xr-x    2 root     root         4096 12월  5 18:01 web_install
srwxr-xr-x    1 root     root            0  1월 14 18:05 loging_socket
...


위의 결과에서 가장 앞부분 10자리가 그 파일의 특성과 권한을 나타내는데, 그중
제일 앞부분이 파일의 종류를 나타내고, 우리는 가장 앞부분의 한바이트의 문자를
이용해서 어떤 종류의 파일인지를 알아낼수 있다.<br>
Unix 에서 자주 사용하는 파일의 종류를 아래 테이블에 정리해 두었으니 참고
바란다.
-         일반 파일
s         소켓파일
d         디렉토리
p         FIFO
l         심볼링 링크된 파일
b         블럭 디바이스
c         캐릭터 디바이스

파일 정보 가져오기
파일의 정보는 stat(2)를 통해서 가지고 오며, 가지고온 정보는
struct stat 구조체에 저장된다. 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 */
};


위의 구조체의 정보는 inode 테이블을 참조해서 가지고오며, 우리가 필요로
하는(그 이상의) 상세한 정보를 가져온다는 것을 알수 있을것이다. inode
테이블에 대한 내용을 원한다면 /usr/src/linux/include/fs.h 의 sturct inode
를 참조하면 된다.

그럼 간단한 예제 프로그램을 만들어 보겠다. 이 프로그램은 아규먼트로 파일이름을
받아서 그 파일의 정보를 되돌려주는 프로그램으로,
파일의 권한, 퍼미션, 파일의 크기, 마지막에 수정된 날짜, 파일의 종류 등을
되돌려줄것이며, 존재하지 않는 파일의 경우 적절한 에러메시지를 출력하고
종료하게 될것이다. <br>
이 예제의 이름은 file_info 로 하겠다. <br><br>

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <pwd.h>
#include <grp.h>

int main(int argc, char **argv)
{
    int return_stat;
    char *file_name;
    struct stat file_info;

    struct passwd *my_passwd;
    struct group  *my_group;

    mode_t file_mode;

    if (argc != 2 )
    {
        printf("Usage : ./file_info [file name]n");
        exit(0);
    }
    file_name = argv[1];
    
    if ((return_stat = stat(file_name, &file_info)) == -1)
    {
        perror("Error : ");
        exit(0);
    }

    file_mode = file_info.st_mode;
    printf("파일이름 : %sn", file_name);
    printf("=======================================n");
    printf("파일 타입 : n");
    if (S_ISREG(file_mode))
    {
        printf("정규파일n");
    }
    else if (S_ISLNK(file_mode))  
    {  
        printf("심볼릭 링크n");
    }
    else if (S_ISDIR(file_mode))
    {
        printf("디렉토리n");
    }
    else if (S_ISCHR(file_mode))
    {
        printf("문자 디바이스n");
    }
    else if (S_ISBLK(file_mode))
    {
        printf("블럭 디바이스n");
    }
    else if (S_ISFIFO(file_mode))
    {
        printf("FIFOn");
    }
    else if (S_ISSOCK(file_mode))
    {
        printf("소켓n");
    }

    my_passwd = getpwuid(file_info.st_uid);
    my_group  = getgrgid(file_info.st_gid);
    printf("OWNER : %sn", my_passwd->pw_name);
    printf("GROUP : %sn", my_group->gr_name);
    printf("FILE SIZE IS : %dn", file_info.st_size);
    printf("마지막 읽은 시간 : %dn", file_info.st_atime);
    printf("마지막 수정 시간 : %dn", file_info.st_mtime);
    printf("하드링크된 파일수 : %dn", file_info.st_nlink);
}

완벽하진 않지만 그럭저럭 작동하는 프로그램이다.

프로그램은 아마 설명이 필요 없을 정도로 간단할것이다. 단지 마지막의
file_info.st_nlink (하드링크) 부분이 약간 헷갈릴 것이다. 하드링크란
보통 C 의 link(2) 함수와 쉘 코멘드인 link 에 -d 옵션을 줌으로서 만들어
진다. cp 를 이용한 복사와 하드링크를 혼동하지 말라, cp 를 이용한
복사는 자신만의 inode 를 가지는 전혀 새로운 파일을 만들지만, 하드링크의
경우 동일한 inode 를 가지고 파일이름을 만든다. 하드링크는 inode 를 가지고
파일이름을 만들므로 서로 다른 파일시스템 사이로 연결할수는 없다.<br>
그 이유는
inode 가 해당 파일시스템에서만 유일하기 때문으로 여러개의 파일시스템을
사용할경우 다른 쪽 파일시스템에서 그 inode 가 유일함을 보장할수 없기 때문이다.

stat 는 너무 복잡합니다. 더 간단한 함수는 없을까요?
우리가 어떤 프로그램을 만들때, 우리는 종종 그 프로그램이 사용하는
파일(설정파일, 데이타 파일)들이 존재하는지 등을 검사할 필요가 있다. 이때에도
위의 stat 를 이용해서 해결 할수 있지만, 왠지 복잡하다는 생각이든다. <br>
이때는 access(2) 를 사용하면된다.

access 는 검사할 파일에 대하여 4가지 항목, 읽을수 있는지(R_OK),
쓸수 있는지 (W_OK), 실행가능 한지 (X_OK), 존재하는 파일인지(F_OK) 등에
대한 정보를 돌려준다.

#include
#include
    
int main(int argc, char **argv)
{  
    if (access(argv[1], F_OK) != 0)
        perror("파일이 존재하지 않음 : ");
    else
        printf("파일 존재함n");
}
    


[yundream@localhost test]# gcc -o access access.
파일이 존재하지 않음 : : No such file or directory


파일 정보 변경하기
파일 정보 들을 보면 시간과 관련된 정보들이 있다. 파일에 대한 접근, 수정 시간이 이들인데, utime(2)을 이용해서 변경할 수 있다. 자세한 내용은 함수링크를 참조하기 바란다.

번호 제목 글쓴이 날짜 조회 수 추천 수
835 리눅스 새 하드 장착하기 RanomA 2021.12.01 600 0
834 리눅스 SSH Network error: Software caused connection abort RanomA 2021.05.29 2018 0
833 인터넷 기본 설정 복원 창 띄우는 방법들 file RanomA 2021.05.01 1025 0
832 리눅스 디렉토리별 압축 파일 생성 쉘 스크립트 RanomA 2021.04.04 831 0
831 Javascript 숫자에 끊어 읽기 컴마(,) 추가 RanomA 2020.11.27 752 0
830 Javascript 문자열을 포맷 맞춰 날짜로, 날짜를 포맷 맞춘 문자열로 변환 RanomA 2020.11.26 719 0
829 Javascript 날짜 더하기 RanomA 2020.11.26 451 0
828 Javascript 해당 연월의 마지막 날짜 가져오기 RanomA 2020.11.25 365 0
827 Javascript isNullOrEmpty RanomA 2020.11.25 686 0
826 Javascript 전화번호 포매팅 RanomA 2020.11.25 2309 0
825 Javascript IN RanomA 2020.11.18 261 0
824 Javascript LPAD RanomA 2020.11.17 582 0
823 Adobe Creative Cloud 업데이트 실패 184(혹은 C184) 오류 file RanomA 2020.09.08 1073 0
822 오라클 테이블 레이아웃 조회 Query RanomA 2020.01.13 2064 0
821 SQL Developer의 폰트 설정에서 폰트 목록이 안나타날 때 [6] file RanomA 2019.12.30 4877 0
820 Underscore( _ 문자)를 카멜 케이스(Camel Case)로 변환하기 RanomA 2019.12.06 1815 0
819 라이트룸(Adobe Lightroom) 한자/일본어용 폰트 변경 file RanomA 2018.06.06 2145 0
818 마녀의 빗자루와 악마와의 파티 RanomA 2018.03.23 891 0
817 크레인 안전 점검이 허술해진 게 이명박 때가 아니다? RanomA 2018.01.06 709 0
816 인도 중국의 분쟁 지역 file RanomA 2017.08.17 1296 0