본문 바로가기
프로그래밍/C

C, Linux ] ls 명령어 구현

by eteo 2022. 8. 17.

 

리눅스의 ls 명령어 구현하기

 

#include<stdio.h>
#include<stdlib.h>

// 디렉터리 관련 DIR, struct dirent, opendir(), readdir(), closedir() 등이 정의된 헤더 포함
#include<dirent.h>

// Unix 에 쓰이는 표준 심볼들과 상수, 함수들이 정의된 헤더 포함
#include<unistd.h>

int main(int argc, char* argv[])
{
		// cwd에 1024 byte 동적할당
        char * cwd = (char *)malloc(sizeof(char) * 1024);
        
        // DIR 과 dirent 구조체 포인터를 만들고 일단 NULL 대입
        DIR * dir = NULL;
        struct dirent * entry = NULL;

		// 추가 인자 없이 실행된 경우
        if(argc==1){
        		
                // getcwd() 함수는 현재 작업 디렉토리의 경로명을 문자열로 얻음
                // 이 값을 cwd 버퍼에 저장
                getcwd(cwd, 1024);
				
                // opendir() 함수는 디렉토리 스트림을 열어서 DIR* 포인터를 반환함
                // 이 값을 dir에 저장해서 사용
                if((dir = opendir(cwd)) == NULL)
                {
                        printf("current directory open error\n");
                        exit(1);
                }
        }else
        {
        		// main 함수에 추가 인자가 전달된 경우 argv[1] 문자열로 디렉토리 스트림 열어
                // 디렉토리 포인터 변수에 담기
                if((dir = opendir(argv[1])) == NULL)
                {
                        printf("directory open error\n");
                        exit(1);
                }
        }

		// readdir()함수는 디렉토리 포인터를 통해서 디렉토리 정보를 하나씩 차례대로 읽음
        // 디렉토리 스트림의 끝에 도달하거나 에러가 발생하면 NULL을 리턴
        // 정상적으로 읽은 경우 struct dirent 구조체 포인터를 반환하는데 이 값을 entry에 저장하고
        // 파일명이 저장된 구조체 멤버인 char 배열 d_name을 문자열로 출력
        while((entry = readdir(dir)) != NULL)
        {
                printf("%s\n", entry->d_name);
        }

        printf("\n");
        
        // 동적할당 해제하고 디렉터리 스트림 닫기
        free(cwd);

        closedir(dir);

        return 0;

}

 

 

struct dirent 구조체와 DIR 구조체의 정의

https://mymanual.tistory.com/1

 

getcwd 함수의 원형

#include <unistd.h>

char *getcwd(char *buf, size_t size);

 

 

 

 

실행 화면