'파일정보 출력'에 해당되는 글 4건

C언어 - 파일 정보 struct stat, 구조체

IT/C 언어

파일 정보를 저장하는 구조체


struct stat 구조체를 살펴 보면 다음과 같다.


struct stat {
     dev_t           st_dev;        /*ID of device containing file */

     ino_t            st_ino;          /*inode number*/

     mode_t       st_mode;     /*protection*/

     nlink_t         st_nlink;       /*number of hard links*/

     uid_t            st_uid;          /*user ID of owner*/

     gid_t            st_gid;          /*group ID of owner*/

     dev_t           st_rdev;        /*device ID (if special file)*/

     off_t             st_size;         /*total size, in byte*/

     blksize_t      st_blksize;    /*blocksize for file system I/O*/

     blkcnt_t       st_blocks;     /*number of 512B blocks allocated*/

     time_t;        st_atime;      /*time of last access*/

     time_t;        st_mtime;     /*time of last modification*/

     time_t         st_xtime;       /*time of last status change*/

};


파일 정보를 담는 stat구조체에서 각 필드들은 각각 의미가 있다.


  • st_dev         - 장치 파일의 위치 및 여부를 기술

  • st_ino          - 파일의 inode 번호

  • st_mode     - 파일의 모드를 다룸

  • st_nlink       - 파일의 하드링크 수

  • st_uid          - user ID 

  • st_gid          - group ID

  • st_rdev        - 장치 파일 (inode)를 기술

  • st_size         - 파일의 사이즈 

  • st_blksiez   - 효율적인 I/O 파일 시스템 위한 블럭 사이즈

  • st_blocks    - 파일에 할당한 블럭의 수


stat 구조체에서 각 필드들 주목할 만한 부분은 바로 3번째 필드인 st_mode이다.


st_mode에 따라서 파일의 종류를 알 수 있고, 파일의 퍼미션(permission)도 알 수 있다.



st_mode로 파일 종류를 알 수 있는데, 위의 매크로로 설정 되어 있는 (m)부분에 st_mode 값를 넣어 주기만 하면 된다.


아래 예를 들자면,


이런 형식으로 파일 종류를 알 수 있다.


매크로를 통해 알 수 있는 방법과, 비트 연산 ( |, & )을 통해 파일 종류 및 퍼미션 등을 알 수 있다.


예를 보면,


st_mode와 간단한 비트 연산을 통해서 파일에 대한 정보들을 알 수 있다.


상세한 정보는

#man stat 명령어 시 확인 할 수 있다.


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

IT/프로그래밍 과제


구현한 ls 명령어는 정확히 Linux/Unix에서 ls -al옵션을 구현한 것이다.

-a의 옵션은 숨긴파일도 표시하는 옵션이고, -l 옵션은 파일의 상세정보를 보는 옵션이다.


아래 코드는 스크린샷으로 공개하며,

첨부파일에 코드를 업로드를 할 것입니다.


필요하신분은 가져가서 쓰시되, 상업용으로 사용하지 말아주셨으면 좋겠습니다.

프로그래밍 공부를 하시는 분들게 좋은 자료가 되었으면 좋겠습니다.

자료를 퍼가실때 출처와 댓글에 퍼간다는 댓글 남겨주시는 센스 부탁드립니다.


이 코드는 제가 직접 과제를 진행하며 작성한 코드이며 ls 명령어의 정확한 답이 아님을 말씀드립니다.

코드에 대해 잘못된 부분이나 지적 사항등을 남겨주시면, 오히려 제가 더 감사하겠습니다.


궁금한점 있으시면 댓글 or 메일 주시면 답변 드리겠습니다.


 ※다운로드

Homework1.c

list.c

list.h

user.h






※파일 설명


파일은 Homework.c user.h list.c list.h 4가지 입니다.


사용한 자료구조는 단일 링크드 리스트이고, 정렬 방법은 버블정렬 입니다.


list.c list.h는 링크드 리스트 관련 함수 소스와 헤더파일로 mastering algorithm with c 책의 소스입니다.

링크드 리스트 관련 함수는 따로 사진은 올리지 안겠습니다.


user.h는 헤더파일들을 #include하고, 여러 #define 매크로들과 파일정보를 저장할 구조체 선언과

구현한 함수들이 선언되어 있습니다.


Homework.c파일은 메인 함수와 여러 함수들의 code가 있는 파일입니다.


1. user.h 파일


2. Homework.c 파일



 이전 ls 명령어 구현, 포스팅 보기

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


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








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

 




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..