반응형
Ch03. 파일과 디렉토리
학습 목표
- 유닉스 파일의 특징을 이해한다.
- 파일에 관한 정보를 검색하는 함수를 사용할 수 있다.
- 하드 링크와 심볼릭 링크 파일을 이해하고 관련 함수를 사용할 수 있다.
- 파일 사용권한을 검색하고 조정하는 함수를 사용할 수 있다.
- 디렉토리의 특징을 이해한다.
- 디렉토리의 내용을 검색하는 함수를 사용할 수 있다.
- 디렉토리를 생성하고 삭제하는 함수를 사용할 수 있다.
목차
- 유닉스 파일의 특징
- 파일 정보 검색
- 파일의 종류 및 접근권한 검색
- 하드링크 및 심볼릭 링크 생성
- 디렉토리 관련 함수
01. 유닉스 파일의 특징
-
파일
: 유닉스에서 파일은 데이터 저장, 장치구동, 프로세스 간 통신 등에 사용 -
파일의 종류
: 일반 파일, 디렉토리, 특수 파일 -
일반 파일
- 텍스트 파일, 실행파일, 라이브러리, 이미지 등 유닉스에서 사용하는 대부분의 파일
- 편집기나 다른 응용 프로그램을 통해 생성
- 장치파일
- 장치를 사용하기 위한 특수 파일
- 블록 장치 파일 : 블록단위(8KB)로 읽고 씀
- 문자 장치 파일 : 섹터단위(512바이트)로 읽고 쓴다 -> Raw Device
- 예 : /devices
- 디렉토리
- 디렉토리도 파일로 취급
- 디렉토리와 관련된 데이터 블록은 해당 디렉토리에 속한 파일의 목록과 inode저장
파일의 종류 구분
- ls -l 명령으로 파일의 종류 확인 가능 : 결과의 맨 앞 글자로 구분
- 파일 종류 식별 문자
파일의 구성 요소
- 파일명
- 사용자가 파일에 접근할 때 사용
- 파일명과 관련된 inode가 반드시 있어야 함
- inode
- 외부적으로 번호를 표시
- 내부적으로는 두 부분으로 나누어 정보를 저장
- 파일 정보를 저장하는 부분
- 데이터 블록의 주소를 저장하는 부분
- 파일의 inode 번호는 ls -i 명령으로 확인 가능
- 데이터 블록
: 실제 데이터가 저장되는 부분
02. 파일 정보 검색
파일명으로 파일 정보 검색 : stat()
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *restrict path, struct stat *buf);
- inode에 저장된 파일 정보 검색
- path에 검색할 파일의 경로를 지정하고 , 검색한 정보를 buf에 저장
파일 기술자로 파일 정보 검색 : fstat( )
#include <sys/types.h>
#include <sys/stat.h>
int fstat(int fd, struct stat *buf);
: fd로 지정한 파일의 정보를 검색하여 buf에 저장
03. 파일의 종류 및 접근권한 검색
파일 접근 권한 제어
- stat 구조체의 st_mode 항목에 파일의 종류와 접근 권한 정보 저장
- st_mode 값의 구조
파일 종류 검색
- 상수를 이용한 파일 종류 검색
- 파일의 종류 검색 관련 상수
- st_mode 값과 상수값을 AND(&) 연산하면 파일의 종류 부분만 남게 됨
- 매크로를 이용한 파일 종류 검색
- 각 매크로는 인자로 받은 mode 값을 0xF000과 AND 연산 수행
- AND 연산의 결과를 파일의 종류별로 정해진 값과 비교하여 파일의 종류 판단
- 이 매크로는 POSIX 표준
파일 접근권한 검색
- 상수를 이용한 파일 접근 권한 검색
- 소유자의 접근권한 추출과 관련된 상수만 정의
- 소유자 외 그룹과 기타 사용자의 접근권한은?
: st_mode의 값을 왼쪽으로 3비트 이동시키거나 상수값을 오른쪽으로 3비트 이동시켜 AND 수행 - POSIX에서 정의한 접근권한 검색 관련 상수
-
함수를 이용한 파일 접근 권한 검색 : access()
#include <unistd.h> int access(const char *path, int amode);
- path에 지정된 파일이 amode로 지정한 권한을 가졌는지 확인하고 리턴
- 접근권한이 있으면 0을, 오류가 있으면 -1을 리턴
- 오류 메시지
- ENOENT : 파일이 없음
- EACCESS : 접근권한이 없음
- amode 값
- R_OK : 읽기 권한 확인
- W_OK : 쓰기 권한 확인
- X_OK : 실행 권한 확인
- F_OK : 파일이 존재하는지 확인
파일 접근권한 변경
-
파일명으로 접근권한 변경: chmod()
#include <sys/types.h> #include <sys/stat.h> int chmod(const char \*path, mode\_t mode);
- Path 에 지정한 파일의 접근권한을 mode 값에 따라 변경
- 접근권한을 더할 때는 OR 연산자를, 뺄 때는 NOT연산 후 AND 연산자 사용
-
파일 기술자로 접근권한 변경 : fchmod()
#include <sys/types.h> #include <sys/stat.h> int fchmod(int fd, mode\_t mode);
04. 하드링크 및 심볼링 링크 생성
링크 파일 생성
- 링크
- 이미 있는 파일이나 디렉토리에 접근할 수 있는 새로운 이름
- 같은 파일/디렉토리지만 여러 이름으로 접근할 수 있게 한다
- 하드 링크 : 기존 파일과 동일한 inode사용, inode에 저장된 링크 개수 증가
- 심볼링 링크 : 기존 파일에 접근하는 다른 파일 생성(다른 inode 사용)
-
하드링크 생성 : link()
#include <unistd.h> int link(const char \*existing, const char \*new);
- 두 경로는 같은 파일시스템에 존재해야 함
-
심볼릭 생성 : symlink()
#include <unistd.h> int symlink(const char \*name1, const char \*name2);
심볼릭 링크 정보 검색
-
심볼릭 링크 정보 검색 : lstat()
#include <sys/types.h> #include <sys/stat.h> int lstat(const char \*path, struct stat \*buf);
- 심볼링 링크 자체의 파일 정보 검색
- 심볼릭 링크를 stat함수로 검색하면 원본 파일에 대한 정보가 검색
-
심볼릭 링크의 내용 읽기 : readlink
#include <unistd.h> ssize\_t readlink(const char \*restrict path, char \*restrict buf, size\_t bufsiz);
: 심볼릭 링크의 데이터 블록에 저장된 내용 일기
-
원본 파일의 경로 읽기 : realpath
#include <stdlib.h> char \*realpath(const char \*restrict file\_name, char \*restrict resolved\_name);
: 심볼릭 링크가 가리키는 원본 파일의 실제 경로명 출력
05. 디렉토리 관련 함수
디렉토리 관련 함수
-
디렉토리 생성 : mkdir()
#include <sys/types.h> #include <sys/stat.h> int mkdir(const char \*path, mode\_t mode);
: path에 지정한 디렉토리를 mode권한에 따라 생성한다
-
디렉토리 삭제 : rmdir()
#include <unistd.h> int rmdir(const char *path);
3. 디렉토리 변경 : rename()
#include <stdio.h>
int rename(const char *old, const char *new);
4. 현재 작업 디렉토리 위치 : getcwd()
#include <unistd.h>
char *getcwd(char *buf, size_t size);
: 현재 작업 디렉토리 위치를 알려주는 명령은 pwd, 함수는 getcwd
5. 디렉토리 이동 : chdir()
#include <unistd.h>
int chdir(const char *path);
디렉토리 정보 검색
1. 디렉토리 열기 : opendir()
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *dirname);
: 성공하면 열린 디렉토리를 가리키는 DIR 포인터를 리턴
2. 디렉토리 닫기 : closedir()
#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);
3. 디렉토리 정보 읽기 : readdir()
#include <sys/types.h>
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
: 디렉토리의 내용을 한 번에 하나씩 읽어옴
4. 디렉토리 오프셋 : telldir(), seekdir(), rewinddir()
#include <dirent.h>
long telldir(DIR *dirp);
void seekdir(DIR *dirp, long loc);
void rewinddir(DIR *dirp);
- telldir : 디렉토리의 오프셋의 현재 위치를 알려줌
- seekdir : 디렉토리 오프셋을 loc에 지정한 위치로 이동시킴
- rewinddir : 디렉토리 오프셋을 디렉토리의 시작인 0으로 이동시킴
반응형