Linux/System Programming

ls 명령어 구현.

Ohjeonghak 2013. 7. 14. 19:34
반응형

학교 수업 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