리눅스 시스템 프로그래밍 수업 과목 과제 코드 및 보고서 정리
지정한 파일 또는 디렉토리의 이름을 탐색해서 파일 및 디렉토리의 속성을 비교하는 프로그램.
프로그램이 실행되고, 프롬프트가 떠야 함.(예시: 학번>> ) 이 프롬프트 상에서 입력을 받으며, find, help, exit 명령어를 입력할 수 있다. 여기서는 find에 대해서만 설명하며 자세한 것은 보고서에 나와있음.
find 명령어의 첫번째 인자는 기준 파일명(혹은 디렉토리도 가능함. 이는 뒤에 설명),두 번째 인자는 탐색을 시작할 디렉토리 경로임. 그 이후부터는 옵션들과 이 기준 파일과 이름과 크기가 동일한 모든 파일들을 찾아서, 정보들을 보여줘야 함.
또한, 이렇게 찾은 파일들 중 파일 내용이 기준 파일과 다른 것이 있을 수 있기 때문에 사용자가 지정한 옵션에 따라 파일 내용을 비교해서 기준파일과 다른 점을 출력해서 보여줘야 한다.
만약,입력 받은 첫번째 인자가 디렉토리였다면 이 프로그램의 동작방식은 달라진다. 첫 번째 인자가 디렉토리인 경우는 재귀를 활용해서 그 내부 모든 파일의 사이즈 합을 구하고, 이것을 해당 디렉토리의 크기로 정의한다. 이 경우, 기준 디렉토리와 크기 및 이름이 같은 모든 디렉토리를 찾아서 출력해서 보여주면 된다. 이후, 파일비교때와 동일하게 인덱스를 사용자가 선택해서 두 디렉토리 간의 차이를 보여줄 수 있어야 한다. 이때, 두 디렉토리 간의 차이는 내부에 들어있는 파일들을 기준으로 한다. 한쪽 디렉토리에만 있는 파일이면 한쪽에만 있다고 표시하고, 둘이 이름과 크기가 같은 파일이 있는 경우 모두 파일 비교때처럼 두 파일 간 내용 차이점을 출력한다.
- 디렉토리를 탐색하는 방법
- 유닉스 파일 시스템의 기본적인 구조와 i-node블록과 데이터 블록의 관계
- 파일의 정보를 얻을 수 있는 stat 자료구조와 stat 함수 사용법
- 정규 파일인지 디렉토리 파일인지, 그 외 파일인지를 알 수 있는 stat.st_mode 활용법
지정한 디렉토리 아래부터 시작해서, 지정한 최소크기~최대크기 범위 안에 들어오고, 지정한 확장자를 갖는 모든 파일들을 대상으로 그 안에서 동일한 내용을 갖는 파일들을 한 세트씩 묶어서 모든 세트를 보여주는 프로그램. 또한, 이 세트들 중 특정 세트를 지정하고 그 안의 특정 파일을 지정해서 지정한 옵션(d,i,f,t)을 활용해서 삭제할 수 있어야 함.
** 여기서 동일한 파일이라는 것의 정의는, 크기가 동일하고 해시알고리즘의 결과가 같은 파일들의 관계를 말함.
프로그램이 실행되고, 프롬프트가 떠야 함.(예시: 학번>> ) 이 프롬프트 상에서 입력을 받으며, fmd5, fsha1, exit, help 등의 명령어를 실행할 수 있다. 각 명령어는 내부적으로 fork-exec-wait 를 활용해서 별도의 프로세스로 구성되어야 함.
fmd5와 fsha1은 각각 md5, sha1 해시 알고리즘을 사용함.
fmd5와 fsha1은 알고리즘만 다를 뿐 동작 원리는 동일한 명령어임. 파일 확장자, 최소 크기, 최대 크기, 탐색 시작 디렉토리 등을 입력받아서 실행된다. 이차원 링크드리스트에 동일한 내용의 파일들을 관리하고, 사용자에게 보여주며 지정한 옵션에 따라 삭제가 가능해야 한다.
- fork-exec-wait 로 한 프로그램 안에서 멀티 프로세스로 분리하고 관리하는 방법
- Makefile 을 사용해서 컴파일,clean 등의 과정에 대한 간편화
- md5, sha1 해시 알고리즘에 대한 학습 및 사용법
- 이차원 링크드리스트를 직접 구현하고 관리하며 얻은 구현 능력 및 자료구조에 대한 이해도 향상
사용자 쓰레드 라이브러리를 이용하여 리눅스 시스템 내 존재하는 동일한(중복) 파일을 찾고 삭제 및 복원하는 ssu_sfinder 프로그램 구현
기본적인 동작 구조는 ssu_sdup과 유사함. 다만, ssu_sdup이 멀티 프로세스로 파일탐색을 했다면, ssu_sfinder는 사용자 쓰레드 라이브러리를 사용해서 단일 프로세스 안에서 파일 탐색 과정을 쓰레드들끼리 분할해서 진행 시키는 것임. 또한, 이 프로그램에서 진행한 내용들을 로그파일에 모두 저장해야함. 단, 로그파일은 숨김파일로 관리한다.
fsha1, fmd5, list, trash, restore, exit, help 명령어를 사용가능하며, fsha1과 fmd5를 실행할때 -t 옵션을 사용해서 사용할 사용자 쓰레드 갯수를 지정가능하다. 최대 5개 까지 가능하며, 기본 값은 1개임.
list 명령어는 fsha1, fmd5 이후 실행할 수 있는 명령어이며, fsha1, fmd5 에서 출력한 이차원 링크드리스트를 재정렬하는 명령어다.
trash 명령어는 휴지통에 있는 파일들을 불러와서 지정한 정렬방식에 따라 화면에 출력해서 보여줘야 한다. 이를 위해, ~/.Trash 디렉토리 아래에, files 디렉토리와 info 파일을 관리해야 한다. files 디렉토리는 이 프로그램에서 삭제한 파일들을 담고 있고, info 파일에는 files 안에 있는 삭제된 파일들에 대해 복구할 수 있도록 메타 정보를 담고 있다.
restore 명령어는 trash 이후, 복구하고 싶은 파일을 지정해서 복구할 수 있는 명령어다. restore 를 수행한 이후 휴지통 목록을 다시 화면에 보여줘야 한다. 또한, 복구한 다음 list 명령어를 출력하면 복구한 내용을 반영한 중복 파일 관리 리스트 정보를 다시 보여줘야 한다.
- getopt 를 사용해서 체계적으로 명령어 옵션을 관리하는 방법
- 사용자 쓰레드 라이브러리를 사용해서 파일 탐색을 분할해서 하는 방법. 이 과정에서 뮤텍스로 임계영역을 관리함.
- 이 과정에서 이전 과제2와 다른 점은 메모리 제한에서 벗어나기 위해, 중복 파일 탐색 과정에서 디스크 상의 파일을 사용한다는 점임.
- 과정은 다음과 같다. 우선, 파일의 사이즈 별로 20182580 디렉토리 아래에 파일 크기를 이름으로 하는 파일을 만든다.
- 그리고 이 파일사이즈 이름으로 된 파일 안에, 이번에 탐색한 파일의 경로 정보를 적는다.
- 이후, 파일 사이즈 이름으로 된 파일들을 스레드 단위로 탐색하도록 한다. 이를 통해 메모리의 제약에서 벗어난 중복 파일 탐색을 할 수 있다.
- 실행 로그 파일을 작성하는 경험 및 삭제된 파일을 복구하기 위해 메타 데이터를 관리하는 경험