130 likes | 459 Views
시스템 프로그래밍 응용 - 예제 3-4,5-. 컴퓨터정보학부 2002242026 김용식. Stat,Fstat 란 ?? 파일의 상태를 질의할수 있으며 , 파일 유형 , 소유자 , 접근허가 , 크기 , 링크수 Inode 번호 , 파일 접근시간 정보 반환. Stat 호출 함수 사용법. #include <sys/types.h> #include <sys/stat.h> Int stat(const char *path, struct stat *buf);
E N D
시스템 프로그래밍 응용-예제 3-4,5- 컴퓨터정보학부 2002242026 김용식
Stat,Fstat란?? • 파일의 상태를 질의할수 있으며, • 파일 유형,소유자,접근허가,크기,링크수 • Inode번호,파일 접근시간 정보 반환
Stat호출 함수 사용법 • #include <sys/types.h> • #include <sys/stat.h> • Int stat(const char *path, struct stat *buf); • Int fstat(int fildes,struct stat *buf);
Buf란 stat구조체의 포인터. • 파일에 대한 정보를 구조체로 가져옴. buf Stat구조체 파일 정보 반환값:정상 종료시 ‘0’그렇지 않을때에는 ‘-1’반환
Stat.h에 포함되는 기능. St_mode; 파일의 모드 St_ino; Inode 번호 St_dev; 디바이스가 포함한id St_rdev; 디바이스id,문자 특수 파일이나 블록 특수파일을 위해 정의 St_nlink; 링크의 수 St_uid; 파일 소유자의 사용자id St_gid; 파일 소유자의 그룹id St_size; 파일의 크기 St_atime; 마지막으로 엑세스한 시간 St_mtime; 마지막으로 데이터를 수정한 시간 St_ctime; 마지막으로 status를 변경한 시간 St_blksize; I/O블록의 크기 St_blocks; 디스크에 배당된 물리적 블록의 크기
#include <sys/types.h> • #include <sys/stat.h> • main(argc,argv) • int argc; • char *argv[]; • { • struct stat stbuf; /*stat형의 구조체 선언*/ • Int stat(); • if(stat(argv[1],&stbuf) == -1) { /*비정상 반환시’-1’반환*/ • perror(argv[1]); • exit(1); • } • printf("file name: %s\t\t",argv[1]); printf("device: %d\t",stbuf.st_dev); /*장치번호*/ • printf("i-number: %u\n",stbuf.st_ino); /*inode번호*/ • prntmode(&stbuf); /*파일의모드 출력프로그램*/ • printf("links: %d\t",stbuf.st_nlink); /*링크의 수*/ • printf("file size: %ld\n",stbuf.st_size); /*파일의 크기 출력*/ • prntuser(&stbuf); • prntimes(&stbuf); • exit(0); • }
prntmode(stbuf) struct stat *stbuf; { switch(stbuf->st_mode & S_IFMT) { case S_IFDIR: /*정규 파일*/ printf("directory\t"); break; case S_IFCHR: /*문자특수파일*/ printf("character special file\t"); printf("special device: %d\t",stbuf->st_rdev); break; case S_IFBLK: /*블럭특수파일*/ printf("block special file\t"); printf("special device: %d\t",stbuf->st_rdev); break; case S_IFREG: /*정규파일*/ printf("regular file\t"); break; case S_IFIFO: /*FIFO파일*/ printf("named pipe\t"); break; } if(stbuf->st_mode & S_ISUID) printf("setuid\t"); if(stbuf->st_mode & S_ISGID) printf("setgid\t"); if(stbuf->st_mode & S_ISVTX) printf("sticky\t"); printf("permissions: %o\n",stbuf->st_mode & 0777); }
#include <pwd.h> #include <grp.h> prntuser(stbuf) struct stat *stbuf; { struct passwd *pw, *getpwuid(); /*password와 group 구조체선언*/ struct group *grp,*getgrgid(); pw = getpwuid(stbuf->st_uid); /*파일소유자의 사용자id*/ printf("user ID: %d name: %s\t",stbuf->st_uid,pw->pw_name); grp = getgrgid(stbuf->st_gid); /*파일소유자의 그룹id*/ printf("group ID: %d group: %s\n",stbuf->st_gid,grp->gr_name); } #include <time.h> prntimes(stbuf) struct stat *stbuf; { char *ctime(); printf("last access: \t\t%s", ctime(&stbuf->st_atime)); printf("last modification: \t%s", ctime(&stbuf->st_mtime)); printf("last status change: \t%s", ctime(&stbuf->st_ctime)); }
-결과- • $ex3-4-5 ex3-4-5 • File name:ex3-4-5 device:8388615 i-number:4032 • Regular file permissions:755 • Links:1 file size:7548 • User ID:300 name:bake group Id:310 group:prof • Last access: Thu Jan 20 14:02:26 1994 • Last modification: Thu Jan 20 14:02:02 1994 • Last status change Thu Jan 20 14:02:02 1994 • $ex3-4-5 /dev/console • File name:/dev/console device:8388608 i-number:15196 • Character special file special device:0 permissions:620 • Links:1 file size:0 • User ID:300 name:bake group Id:7 group:tty • Last access: Thu Jan 20 14:02:26 1994 • Last modification: Thu Jan 20 14:02:02 1994 • Last status change Thu Jan 20 14:02:02 1994
$ex3-4-5/etc • File name:/etc device:8388608 i-number:7559 • Directory permissions:775 • Links:24 file size:3072 • User ID:0 name:root group ID:3 group:sys • Last access: Thu Jan 20 14:02:26 1994 • Last modification: Thu Jan 20 14:02:02 1994 • Last status change Thu Jan 20 14:02:02 1994 • $