리눅스의 기본 구조와 파일 시스템
디바이스, 디렉터리, named pipe, socket 등이 파일로 취급된다.
리눅스 시스템은 파일 권한을 이용하여 보안 기능을 제공한다. (user-group-other)
응용 프로그램 - OS[커널(시스템 콜 인터페이스 - 프로세스 관리, 메모리 관리, 파일 시스템, 디바이스 제어(블럭 디바이스, 문자 디바이스, NIC 디바이스), 네트워크)] - 하드웨어(CPU, RAM, NIC etc)
단일 유닉스 격을 준수
유저 모드와 커널 모드로 동작된다. 시스템 자원에 대한 접근이 필요한 경우 잠시 커널 모드로 전환한 후, 이후 다시 유저 모드로 전환된다.
리눅스 가상 파일 시스템 : 다양한 파일 시스템들을 하나의 파일 시스템처럼 사용할 수 있도록 별도의 레이어를 구성
저수준 파일 입출력 : 단일 유닉스 규격(SUS)을 기반으로 하는 파일 시스템을 다루기 위한 함수
open(), close(), read(), write(), lseek(), unlink(), remove(), fcntl(), dup(), sync() 등으로 구성
open 함수 플래그(2 번째 인자)
플래그 이름 | 값 | 의미 및 설명 |
O_RDONLY | 0x0000 | 읽기 전용 모드로 파일 열기 (Read Only) |
O_WRONLY | 0x0001 | 쓰기 전용 모드로 파일 열기 (Write Only) |
O_RDWR | 0x0002 | 읽기 및 쓰기 모드로 파일 열기 (Read & Write) |
O_CREAT | 0x0040 | 파일이 없으면 새로 생성 (mode 인자 필요) |
O_EXCL | 0x0080 | O_CREAT와 함께 사용 시, 파일이 이미 존재하면 실패 |
O_NOCTTY | 0x0100 | 터미널 장치를 열더라도 이 파일을 제어 터미널로 사용하지 않음 |
O_TRUNC | 0x0200 | 파일을 열 때 기존 내용을 모두 지움 (길이를 0으로) |
O_APPEND | 0x0400 | 항상 파일 끝에 데이터를 추가 (append mode) |
O_NONBLOCK | 0x0800 | 블로킹되지 않도록 열기 (Non-blocking I/O) |
O_DSYNC | 0x1000 | 데이터만 디스크에 동기화, 메타데이터는 제외 |
O_SYNC | 0x101000 | 데이터와 메타데이터를 디스크에 동기화 |
O_RSYNC | 0x101000 | 읽기 연산 시에도 O_SYNC와 동일하게 동기화 |
O_DIRECTORY | 0x20000 | 디렉토리만 열 수 있으며, 일반 파일은 실패 |
O_NOFOLLOW | 0x40000 | 심볼릭 링크를 따라가지 않음 |
O_CLOEXEC | 0x80000 | exec() 호출 시 파일 디스크립터를 자동으로 닫음 |
O_TMPFILE | 0x410000 | 이름 없는 임시 파일 생성 (디렉토리 + O_RDWR 또는 O_WRONLY 필요) |
파일 접근 권한(3 번째 인자, 생략 가능)
심볼릭 상수 | 8진수 값 | 권한 설명 (기본 대상: 새로 생성된 파일) |
S_IRUSR (S_IREAD) | 0400 | 사용자(소유자) 읽기 권한 (User read) |
S_IWUSR (S_IWRITE) | 0200 | 사용자 쓰기 권한 (User write) |
S_IXUSR (S_IEXEC) | 0100 | 사용자 실행 권한 (User execute) |
S_IRGRP | 0040 | 그룹 읽기 권한 (Group read) |
S_IWGRP | 0020 | 그룹 쓰기 권한 (Group write) |
S_IXGRP | 0010 | 그룹 실행 권한 (Group execute) |
S_IROTH | 0004 | 기타 사용자 읽기 권한 (Others read) |
S_IWOTH | 0002 | 기타 사용자 쓰기 권한 (Others write) |
S_IXOTH | 0001 | 기타 사용자 실행 권한 (Others execute) |
일반적인 파일 접근 권한 설정과 비슷하다.
성공하면 파일 디스크립터 테이블 번호를 반환하고, 실패하면 -1을 반환한다.
ssize_t read(int fd, void *buf, size_t count) : 읽기, 버퍼로 내용을 복사, 읽은 바이트 사이즈를 반환
ssize_t write(int fd, const void* buf, size_ t count) : count를 최대로 파일에 쓰게 됨, 실제 작성한 바이트 수 반환
off_t lseek(int fd, off_t offset, int whence) : 기준점을 기준으로 offset만큼 커서를 옮긴다, 이동한 지점의 offset을 반환
SEEK_SET | 0 | 파일의 시작 위치를 기준으로 offset만큼 이동→ offset = 0이면 파일 처음으로 이동 |
SEEK_CUR | 1 | 현재 파일 위치를 기준으로 offset만큼 이동 |
SEEK_END | 2 | 파일 끝을 기준으로 offset만큼 이동→ offset = 0이면 파일 끝으로 이동 |
int fnctl(int fd, int cmd, args) : 파일 디스크립터와 관련된 연산을 지원
F_GETFD | 파일 디스크립터 플래그를 가져옴 (FD_CLOEXEC) |
F_SETFD | 파일 디스크립터 플래그를 설정 |
F_GETFL | 파일 상태 플래그를 가져옴 (O_NONBLOCK, O_APPEND 등) |
F_SETFL | 파일 상태 플래그를 설정 |
F_GETLK | 파일 잠금 정보 조회 |
F_SETLK | 파일 잠금 설정 (비차단 모드) |
F_SETLKW | 파일 잠금 설정 (차단 모드) |
F_DUPFD | 지정된 최소 값 이상의 새로운 파일 디스크립터 복제 |
F_DUPFD_CLOEXEC | FD_CLOEXEC가 설정된 디스크립터 복제 (Linux 2.6.24 이상) |
int ioctl(int fd, int cmd, args) : 디바이스와 관련된 연산들을 지원
범용적인 표준은 존재하지 않고, 제어하는 파일 종류에 따라서 달라짐 ex) 터미널, 네트워크 디바이스, 블록 디바이스, 문자 디바이스 등등
드라이버와 관련된 내용들을 다룰 때 중요해짐!!
파일 시스템에 대한 이론적인 내용은 여기를 참조(간단하게 보기 좋다!)
11 파일시스템 관리
파일시스템은 운영체제에서 데이터를 저장, 관리, 검색하는 방법을 제공하는 중요한 구성 요소입니다. 파일시스템은 디스크나 다른 저장 매체에 데이터를 조직화하고 접근하는 구조와 규칙…
wikidocs.net
'컴퓨터 과학 > 리눅스 프로그래밍' 카테고리의 다른 글
[이론]리눅스 드라이버 원리 (1) | 2025.05.19 |
---|---|
[이론]리눅스 프로그래밍 - 네트워크(TCP/IP, UDP) (2) | 2025.05.09 |
[이론] 스레드(Thread)와 뮤텍스 스레드(Mutex Thread) (0) | 2025.05.08 |
[이론] 세마포어(Semaphore) (0) | 2025.05.08 |
[이론]리눅스 프로그래밍 - 프로세스와 쓰레드 (1) | 2025.05.08 |