ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C/C++ closedir(3)
    C,C++ & Linux 2020. 5. 20. 16:48
    728x90

    closedir(3) 함수 기능

    디렉토리를 닫는 함수

    함수 원형

    #include <dirent.h>
    #include <sys/types.h>
    
    int closedir(DIR *dp);

    매개변수

    dp

    닫고자하는 디렉토리의 DIR 포인터

    반환값

    성공 시 0 리턴

    에러 시 -1 리턴하고 errno 설정

    예제

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <dirent.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    
    #ifdef PATH_MAX
    static int pathmax = PATH_MAX;
    #else
    static int pathmax = 0;
    #endif
    
    #define MAX_PATH_GUESSED 1024
    
    #ifndef LINE_MAX
    #define LINE_MAX 2048
    #endif
    
    char *pathname;
    char command[LINE_MAX],  grep_cmd[LINE_MAX];
    
    int ssu_do_grep() {
        struct dirent *dirp;
        struct stat statbuf;
        char *ptr;
        DIR *dp;
    
    	// pathname 파일의 정보를 읽어들임
        if (lstat(pathname, &statbuf) < 0) {
            fprintf(stderr, "lstat error for %s\n", pathname);
            return 0;
        }
    
    	// pathname 파일이 디렉토리가 아니라면
        if ((S_IFMT & statbuf.st_mode) != S_IFDIR) {
    		// 해당 파일에서 grep 명령을 실행
            sprintf(command, "%s %s", grep_cmd, pathname);
            printf("%s : \n", pathname);
            system(command);
            return 0;
        }
    
    	// 디렉토리라면
        ptr = pathname + strlen(pathname);
        *ptr++ = '/';
        *ptr = '\0';
    
    	// 디렉토리를 연다.
        if ((dp = opendir(pathname)) == NULL) {
            fprintf(stderr, "opendir error for %s\n", pathname);
            return 0;
        }
    
    	// 디렉토리 내부 파일을 순회한다.
        while ((dirp = readdir(dp)) != NULL)
    		// 자기 자신을 의미하는 .과 부모 디렉토리를 의미하는 ..은 탐색에서 제외한다.
            if (strcmp(dirp->d_name, ".") && strcmp(dirp->d_name, "..")) {
    			// ptr에 파일명을 세팅한다
    			// 이는 곧 pathname에 파일명을 이어 붙인것과 같다.
                strcpy(ptr, dirp->d_name);
    
    			// 재귀적으로 grep을 호출한다.
    			// 결국 디렉토리의 모든 서브 디렉토리를 싹 들어가서
    			// 모든 파일에 대해 grep을 하게된다.
                if (ssu_do_grep() < 0)
                    break;
            }
        
    	// 원래대로 pathname을 돌려놓는다.
        ptr[-1] = 0;
    	
    	// 디렉토리를 닫는다.
        closedir(dp);
        return 0;
    }
    
    void ssu_make_grep(int argc, char *argv[]) {
    	// grep 명령을 만드는 함수
        strcpy(grep_cmd, " grep");
    
        for (int i = 1; i < argc - 1; i++) {
            strcat(grep_cmd, " ");
            strcat(grep_cmd, argv[i]);
        }
    }
    
    
    int main(int argc, char *argv[]) {
    
        if (pathmax == 0) {
            if ((pathmax = pathconf("/", _PC_PATH_MAX)) < 0)
                pathmax = MAX_PATH_GUESSED;
            else
                pathmax++;
        }
    
        if ((pathname = (char *) malloc(pathmax + 1)) == NULL) {
            fprintf(stderr, "malloc error\n");
            exit(1);
        }
    
        strcpy(pathname, argv[argc - 1]);
        ssu_make_grep(argc, argv);
        ssu_do_grep();
        exit(0);
    }
    

     

    결과

     

     

     

     

     

     

     

     

     

     

     

    리눅스시스템프로그래밍 저자 : 홍지만
    https://book.naver.com/bookdb/book_detail.nhn?bid=14623672

    책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)

    'C,C++ & Linux' 카테고리의 다른 글

    C/C++ chdir(2) fchdir(2)  (0) 2020.05.21
    C/C++ telldir(3) seekdir(3)  (0) 2020.05.20
    C/C++ rewinddir(3)  (0) 2020.05.20
    C/C++ readdir(3)  (0) 2020.05.20
    C/C++ opendir(3)  (0) 2020.05.20

    댓글

Designed by Tistory.