Linux/Linux_programing

Linux :: 디렉토리, 파일 정보 가져오기

sosal 2010. 1. 29. 06:47
반응형

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */


살펴볼것

1.
stat(), fstat(), lstat() ,struct stat // 파일의 소유자나 그룹의 번호 를 가져오는 함수, 구조체

2.
getcwd() // 현재 디렉토리의 경로를 알아내기 위한 함수
getpwuid(), struct passwd // passwd 파일의 한 항목을 가져오는 함수 및 구조체
getgrgid() , struct group    // group 파일의 한 항목을 가져오는 함수 및 구조체
getlogin()                         // 로그인 이름 반환 함수

3. 245
opendir(), closedir()         // 디렉토리를 열고 닫는 함수
readdir() struct dirent        // 디렉토리 정보를 가져오는 함수 및 구조체
rewinddir(), seekdir(), telldir()   // 디렉토리 스트림 리셋, 지정, 위치 정보 반환 함수



///////////////////////////////////////////////////////////////

1.stat(), fstat(), lstat() ,struct stat

#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>

int stat(const char* path, struct stat* buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char* path, struct stat* buf);

이 함수는 지정된 파일에 대한 정보를 반환한다. 정보를 얻기위해 필요한 접근 권한은 없지만,
파일이 위치하는 디렉토리의 읽기 권한 (탐색 권한)은 필요하다.
stat과 lstat은 동일시 되고, 경로는 절대경로, 상대경로, dirent 구조체의 d_name으로도 판별한다.
fstat은 경로가 아닌, open이나 socket, pipe 등으로 반환된
파일 서술자로 접근하는 함수이다.

lstat과 stat은 비슷하긴 하지만,
lstat은 인자로 받은 경로가 심볼릭 링크일 경우, 심볼릭 링크 파일 자체의 파일 정보를 가져다 준다.
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 */
    blksize_t   st_blksize;        /* blocksize for filesystem I/O */
    blkcnt_t     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 */
//메뉴얼 페이지를 참조하였습니다.

stat 구조체입니다. 파일이 가지는 정보를 가져올 수 있도록 하는 구조체입니다.
각각의 구조체 변수들은 이름이나 간단한 주석으로 쉽게 아실거라 생각됩니다.
특히, st_mode 는 파일의 형식정보가 반환되는 변수입니다.
파일 형식과 접근 권한, 특성 등을 아래 메크로를 통해서 확인할 수 있습니다.

S_ISLNK(file_mode)     //is it a symbolic link?
S_ISREG(file_mode)    //regular file?
S_ISDIR(file_mode)     //directory?
S_ISCHR(file_mode)    //character device?
S_ISBLK(file_mode)     //block device?
S_ISFIFO(file_mode)    //fifo?
S_ISSOCK(file_mode) //socket?




getcwd()

#include<unistd.h>
char *getcwd( char *buf, size_t bufsize);

경로를 나타내는 문자열의 시작 주소가 반환됩니다.
buf :: 현재 디렉토리의 경로가 저장될 배열
bufsize :: 현재 디렉토리 경로 문자열의 크기

버퍼의 크기를 잘못 잡아줄 경우, segmentation fault가 작렬할것이다.
<pwd 사용예제>
#include<stdio.h>
#include<unistd.h>

int main(void){

    char buf[BUFSIZ];
    int bufsize;

    getcwd(buf,bufsize);
    printf("buf :: %s , size :: %u \n",buf,bufsize);
    return 0;
}





getpwuid(), struct passwd

#include<pwd.h>
struct passwd* getpwuid(uid_t uid);
uid :: 사용자 ID를 이용해 passwd 파일의 정보를 가져오는 함수
/etc/passwd 읽기 권한이 있어야 한다.
사실 읽기권한이 없다면 ID 조차 받아오지 못한다. 아래와 같다.



struct passwd{         // getpwuid에서 사용하는 구조체
     char *pw_name;  // 사용자 id
     uid_t  pw_uid;      // 사용자 uid
     gid_t  pw_gid;      // 사용자 gid
     char *pw_dir;       // 로그인 풀더
     char *pw_shell;    // 로그인 쉘
};

#include<stdio.h>
#include<pwd.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
int main(void){

    struct passwd* passwd;
    passwd = getpwuid(getuid());
    printf("pw_name  :: %s\n",passwd->pw_name);
    printf("pw_dir   :: %s\n",passwd->pw_dir);
    printf("pw_shell :: %s\n",passwd->pw_shell);
    printf("pw_uid   :: %d\n",passwd->pw_uid);
    printf("pw_gid   :: %d\n",passwd->pw_gid);
    fflush(stdout);
    return 0;
}




getgrgid() , struct group


#include<grp.h>
struct group* getgrgid( gid_t gid );
gid :: 그룹 ID를 이용하여 passwd 파일의 정보를 가져오는 함수

struct group {
    char *gr_name;      // 그룹명
    gid_t gr_gid;:         // GID
    char **gr_mem;     // 그룹에 속한 멤버 이름들의 배열 (마지막 NULL)
};

#include<stdio.h>
#include<grp.h>
int main(void){
    struct group* grp;
    grp = getgrgid( getgid() );
    printf("gr_name :: %s\n",grp->gr_name);
    printf("gr_gid  :: %d\n",grp->gr_gid);
    return 0;
}



getlogin()


#include<unistd.h>
char *getlogin(void);
로그인한 이름을 반환합니다.

#include<unistd.h>
#include<stdio.h>
int main(void){
    printf("%s\n", getlogin());
    return 0;
}