'IT'에 해당되는 글 24건

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

 




C언어 - 디렉토리 오픈 함수 opendir();

IT/C 언어


함수 원형 DIR * opendir(const char * name);


디렉토리 안의 파일 정보를 읽어오려면 먼저 FILE open처럼, 

DIR open을 해주어야 한다. 디렉토리 오픈을 해주기 위해 사용하는 함수로써,

반환값이 DIR이라는 구조체 포인터이고, 상수 char 포인터 를 인자로 받는다. 즉 문자열을 입력 받고

데이터 손상을 막기 위해 const로 받는다.


opendir 함수를 사용하기 위해선 dirent.h 헤더파일을 #include 해주어야 한다.

ex)

#include <dirent.h>


DIR * 변수를 선언해야 한다.

ex) DIR * spDir;


사진 예제)


예제처럼 절대path를 넣어도 되고, 변수를 넣어도 된다.


$gcc test.c 후 실행사진 )


성공했기 떄문에 success를 출력되었다.


opendir은 실패 혹은 error시에 NULL을 반환하며 error시에는 errno 값에 해당 에러 값이 set된다.


 ERRORS 종류

    -EACCES, 권한 없음.

    -EMFILE, 프로세스가 사용중인 많은 파일 디스크립터.

    -ENFILE, 시스템에서 현재 많은 파일이 오픈됨.

    -ENOENT, 디렉토리가가 없거나 문자열이 비어있음.

    -ENOMEM,  작업을 완료할 메모리가 부족함.

    -ENOTDIR,  디텍토리 파일이 아님. 


좀 더 자세한 정보는 

$man opendir 명령시 확인 할 수 있다.



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

IT/프로그래밍 과제



프로그래밍 과제 1, 

- ls 명령어 구현 디렉토리 파일 정보 출력


프로그래밍 과제1은 터미널에 ls -al /etc를 써넣었을 때와 동일하게 출력하는 과제다.

다른 부분은 전부 같아야하며, 단 출력시 색상은 출력부분은 구현하지 않아도 된다.


먼저 사용 OS, ubuntu terminator에서 ls -al /etc를 쳐보았다.



원래대로 라면 출력되는 정보가 뭔지도 몰랐을 텐데, 

4학년 여름방학 때 받은 교육 탓에 출력되는 정보가 뭔지 알게 되었다.


앞에서 부터 파일 권한, 하드링크 수, 유저명, 그룹명, 크기, 날짜, 시간, 파일 이름, 링크일시 원본 위치 순이였다.

이 과제를 수행하려면 필요한 것이 무엇인지 생각했다.


- 우선 파일 정보를 읽어오려면 디렉토리 open을 해야했고, 그리고 정보들을 저장할 자료구조가 필요했다.

- 그리고 파일 명을 보니 정렬이 되어 있어 sort함수가 필요했다.


그렇게 크게 3가지로 생각하고 함수 구현을 시작 했다.

자료구조는 내가 알고 있던 기본이 되는 단일 Linked list를 구현하기로 했고, 

정렬은 Bubble sort를 사용하기로 했다.


필요한 함수들과 동작 방법을 생각하며 main부터 차근히 코딩을 하기 시작했다.


Continue..



Linux/Ubuntu, 프로그래밍 과제와 네트워크 책

IT/프로그래밍 과제



과제와 책을 받다.


회사에 입사 후, 수습 3개월이란 기간 동안 무엇을 하는 것일까!? 하는 생각이 들었지만,

첫 날, 컴퓨터 조립과 셋팅을 마친 뒤, 나와 동기들에게 주어진 것은 프로그래밍 과제와 네트워크 책이였다.

네트워크 책은 무기로 사용해도 될 만큼 두꺼웠고, 프로그래밍 과제는 어디서 부터 시작해야하는지 막막했다.


프로그래밍 과제는 앞으로 1단계에서 5단계까지 될 것이고, 마치 학교 자료구조와 알고리즘 시간에

기본을 만들고 기능추가와 프로그램을 확장해 가는 방식이었는데, 흡사한 진행 방식이다. 


그리고, Linux를 다룸에 있어서 4학년 여름 방학 때 서버관리 교육을 받은 것들이

회사에서 적응하는 데 많은 도움을 주었다.

간단한 Linux 명령어와 Unix의 명령어들 사용법 같은 것들이, 앞으로 사용할 일이 없을지 알았는데 의외로 

사용하게 되어 교육 받길 잘 했다는 생각이 들었다.


앞으로 과제 및 개발에 있어서 되도록 많은 기록을 하고 

내가 받은 정보들이나 내가 알게 된 것들을 공유하도록 노력해야지.