Linux/Ubuntu, ls 명령어 구현 1단계, 디렉토리 파일 정보 출력 -2

IT/프로그래밍 과제


메인 함수를 작성하며 디렉토리를 열기 위해서 필요한 path를 입력 받아야 했기 때문에,

scanf를 통해서 입력 받았고, 필요한 배열의 크기는 char형 크기 100만큼 선언하였다.


그리고, ls -al /etc 에서 나오는 합계가 처음에는 파일 갯수 인지 알고 갯수를 구하는 함수를 만들었는데,

일치하지 않았다. 그래서, 파일 크기인 것이라 생각하고 임의적으로

디렉토리를 정해서, 크기를 합하였더니 또 다시 일치하지 않았다.


터미널에서 ls -al /usr을 쳐보면 


5번째 출력 정보에 파일 크기인데, 크기가 워낙 차이가 났다. 


왜 그런것인지 고민해보다가, 단위 때문일까 합계에 /1024로 나누어 주니

total의 크기와 같아 지는 것을 볼 수 있었다.


그런데!!, 일치 하지 않는 디렉토리를 볼 수 있었는데

내가 생각했던 파일 크기와는 다른 부분이 있는 것 같았다. 


아직 그 원인을 찾지는 못했지만, 

total부분을 구현하는데, 크기말고 파일의 블럭으로 계산을 하면 일치하는 것을 볼 수 있었다.



그리고 메인에서 DirSeek라는 디렉토리 함수를 만들어,

프로그램에서 파일 정보를찾고 읽고 출력하는 함수를 만들었다.


디렉토리를 open하는 것은 opendir함수를 사용했고,

파일 정보를 읽어오는 것은 readdir함수lstat함수를 사용했다.

(위 함수에 관 것은 Learn IT, C언어 부분에 포스팅 하도록 하겠다.)


원하는 대로, 생각한대로 코딩이 되었고 정상 작동 했다면 이미 과제는 끝났겠지만,

역시나 그렇지 않았고, 문제가 발생했다.


결론부터 얘기하자면, lstat함수에서 발생을 했는데

출력에서 모두 같은 정보만 출력하다가 segmantaion fault 오류가 나는 것이었다.


원인은 lstat에서 에러를 발생해 파일 정보를 얻어오지 못했는데, 

이것을 모르고 한참 해맸다. 그리고 lstat인자에 Path를 넘겨주기 위해,

따로 char * 변수를 선언해 입력받은 Path와 dirent 구조체에 d_name에 저장되어 있는 이름을

strcpy함수와 strcat함수를 이용해 절대 Path를 만들어 주어 넘겨주었다.


즉, 이런 식으로 말이다.

중간에 "/"들어가는 이유는 절대path를 만들어 주기 위해서 넣어주었고 실제로 없으면,

작동하지 않는다.


그리고 파일 정보를 저장할 구조체를 선언한뒤,

lstat함수의 성공시 stat이란 구조체에 저장된 정보들을 구조체에 저장토록 했다.


구조체를 보면,

필요한 정보들을 저장 할 수 있도록 하였다.


ls명령어를 구현함에 있어서 큰 문제중 하나였던 것은 

출력시, 각 항목의 길이에 맞춰서 정렬이 되는 것이었다.


먼저 ls -al /etc를 터미널에 쳐보면,

항목마다 가지런히 정렬되어 출력되는 모습을 볼 수 있다.


내가 만든 ls 명령어 프로그램 코딩을 완성하고 세그멘테이션 폴트 오류도 수정 한 뒤,  컴파일  한 뒤

실행하여 보았더니 이게...

내가 원하는 대로 정렬과 출력이 되었지만, 무엇인가 모양이 이상하다.

바로 출력 정렬이 안되었던 것이다. 이때까지 출력정렬을 하는 법을 자세히 몰랐기에

다시 printf함수를 공부하게 되었다.


그리고 각 파일의 항목마다 가장 큰 값으로 정렬된다는 것을 깨닫고,

항목마다 큰 값을 구해 출력정렬을 하는 함수를 따로 만들어 사용하였다.


그 결과 원하는 정렬로 출력하는 모습을 볼 수 있었고, 

ls -al /etc와 같은 결과를 출력하는 프로그램을 만들 수 있었다.

다음 포스팅에서 구현한 코드와 실행사진을 올리도록 하겠다.


포스팅에서 정렬과 자료구조에 대해 나오지 않았는데, Learn IT카테고리에서 정리해 포스팅 하도록 하겠다.


※혹시나 궁금한 점이 있으신 분은 댓글 or 메일 문의 주시면 답변드리겠습니다.




※ 이전 포스팅 보기


2013/04/27 - [Programming/프로그래밍 과제] - Linux/Ubuntu, ls 명령어 구현 1단계, 디렉토리 파일 정보 출력 -1