반응형
학교 수업 Linux System Programming 의 과제로 ls 명령어를 구현 하라고 문제를 받았다....
문제는 아래와 같다....
주어진 디렉토리 내에 존재하는 파일과 디렉토리를 나열하고, 디렉토리의 경우 재귀적으로 방문해서 그 디렉토리 내에 존재하는 파일과 디렉토리를 나열하는 프로그램을 작성하시오. 즉, "ls -R" 명령과 동일한 결과를 보이도록 하시오.
소스 파일
#include<stdio.h> #include<sys⁄types.h> #include<sys⁄stat.h> #include<dirent.h> #include<unistd.h> #include<string.h> #include<fcntl.h> int ls(char *argv) { DIR *pdir; struct dirent *pde; struct stat buf; int i=0; int count =0; char *dir_name[255]; memset(dir_name, '\0', sizeof(dir_name)); memset(&pde, '\0', sizeof(pde)); memset(&buf, '\0', sizeof(buf)); if((pdir = opendir(argv)) < 0) { perror("opendir"); return 1; } chdir(argv); printf("\n\n"); printf("### DIR -> %s ###\n", argv); while((pde = readdir(pdir)) != NULL) { lstat(pde->d_name, &buf); if(S_ISDIR(buf.st_mode) == 1) { if(!strcmp(pde->d_name, ".") || !strcmp(pde->d_name, "..")) { ; } else { dir_name[count] = pde->d_name; count = count + 1; } } printf("%s\t", pde->d_name); } for(i=0; i<count; i++) { ls(dir_name[i]); } printf("\n"); closedir(pdir); chdir(".."); } int main(int argc, char *argv[]) { if(argc < 2) { fprintf(stderr, "Usage : file_dir dirname.\n"); return 1; } ls(argv[1]); return 0; }
컴파일은 다음과 같이 하면된다
gcc -o ls ls.c |
그리고 실행은 경로를 입력 받도록 되어 있기 때문에 꼭 경로를 입력하면서 실행 하도록 한다.
아래는 예시다.
./ls ./ |
다음은 번외 변으로 exec function 들 중에서 execlp를 사용하여 ls를 구현 해 보도록 하겠다.
exec 함수류 들은 덮어 쓰는 독특한 특성을 가지고 있다.
이번 예제는 컴파일 후 실행 할 때 경로를 입력 해 줄 필요가 없다.
#include<unistd.h> #include<stdlib.h> #include<stdio.h> int main() { printf("--> Before exec function \n"); if(execlp("ls","ls","-a",(char*)NULL)==-1) { perror("execlp"); exit(1); } printf("--> After exec function \n"); return 0; }
반응형
'Linux > System Programming' 카테고리의 다른 글
리눅스 파일 시스템 (0) | 2013.07.21 |
---|