2011. 10. 23. 13:53

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

 

int stat(const char *pathname, struct stat *buf);

int fstat(int *fd, struct stat *buf);

int lstat(const char *pathname, struct stat *buf);

 

 

return: 성공 0, 실패 -1(errno 설정)

stat - pathname으로 주어진 경로이름에 해당하는 파일에 대한 정보를 둘째 인수인 buf 구조체를 통해 얻는다.

fstat - 파일 디스크립터 filedes에 대해 이미 열려 있는 파일에 대한 정보를 조회한다.

lstat – 지정된 파일이 심볼릭 링크(Symbolic link)이면 그 링크가 가리키는 파일이 아니라

             그 링크 자체에 대한 정보를 돌려준다.

 

struct stat 구조체: <sys/stat.h>

struct stat {

        mode_t    st_mode;

        ino_t       st_ino;

        dev_t      st_dev;

        dev_t      st_rdev;

        nlink_t    st_nlink;

        uid_t      st_uid;

        gid_t      st_gid;

        off_t       st_size;

        blksize_t  st_blksize;

        blkcnt_t   st_blocks;

        time_t     st_atime;

        time_t     st_mtime;

        time_t     st_ctime;

};

 

/* 파일 종류 및 모드(접근 권한) */

/* i노드 번호(일련 번호) */

/* 장치 번호(파일 시스템) */

/* 특수 파일들에 대한 장치 번호 */

/* 링크 개수 */

/* 소유자의 사용자 ID */

/* 소유자의 그룹 ID */

/* 바이트 단위 크기(정규 파일의 경우) */

/* 최적의 I/O 블록 크기 */

/* 할당된 디스크 블록 개수 */

/* 마지막으로 접근된 시간 */

/* 마지막으로 수정된 시간 */

/* 파일 상태가 마지막으로 변경된 시간 */

 

[ stat.h에 정의되어 있는 mode_t에 대한 플래그들 ]

mode

Octal

Description

파일 형식 비트 필드

S_IFMT

00170000

bit mask for the file type bit fields

S_IFSOCK

0140000

Socket

S_IFLNK

0120000

Symbolic link

S_IFREG

0100000

Regular file

S_IFBLK

0060000

Block device

S_IFDIR

0040000

Directory

S_IFCHR

0020000

Character device

S_IFIFO

0010000

pipe or FIFO

파일 접근 권한 비트 필드

S_ISUID

0004000

실행에 대한 SUID(set-user-ID)

S_ISGID

0002000

실행에 대한 SGID(set-group-ID)

S_ISVTX

0001000

저장된 텍스트(saved-text, (sticky bit))

S_IRWXU

00700

파일 소유자 권한 마스크

S_IRUSR

00400

read by user (owner)

S_IWUSR

00200

write by user (owner)

S_IXUSR

00100

execute by user (owner)

S_IRWXG

00070

그룹 권한 마스크

S_IRGRP

00040

read by group

S_IWGRP

00020

write by group

S_IXGRP

00010

execute by group

S_IRWXO

00007

Other에 대한 권한 마스크

S_IROTH

00004

read by other (world)

S_IWOTH

00002

write by other (world)

S_IXOTH

00001

execute by other (world)

 

@st_mode와 S_IFMT의 비트 AND 연산

위의 비트 AND 연산 결과를 16진수로 표현하면 0X8000, 8진수로0100000이 되는데,

이는 위의 표에서 S_IFREG와 같으므로 정규 파일(Regular file)을 의미 한다.

if ((st.st_mode & S_IFMT) == S_IFREG)로 표현.

 

 

[ 파일 형식을 좀더 쉽게 알아내는 POSIX 매크로]

Macro

Type of file

#define S_ISREG(m)   (((m) & S_IFMT) == S_IFREG)

regular file

#define S_ISDIR(m)    (((m) & S_IFMT) == S_IFDIR)

directory file

#define S_ISCHR(m)   (((m) & S_IFMT) == S_IFCHR)

character special file

#define S_ISLNK(m)   (((m) & S_IFMT) == S_IFLNK)

block special file

#define S_ISFIFO(m)   (((m) & S_IFMT) == S_IFIFO)

pipe or FIFO

#define S_ISBLK(m)    (((m) & S_IFMT) == S_IFBLK)

symbolic link

#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)

socket

IPC 객체 종류 Macro

Type of object

S_TYPEISMQ(buf)

message queue

S_TYPEISSEM(buf)

semaphore

S_TYPEISSHM(buf)

shared memory object

@ m = mode_t, buf = struct stat 구조체 포인터

 

Posted by devanix