본문 바로가기

컴퓨터 과학/리눅스 프로그래밍

[이론] 리눅스 프로그래밍 - 입출력 함수

반응형

리눅스의 기본 구조와 파일 시스템

디바이스, 디렉터리, 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) 터미널, 네트워크 디바이스, 블록 디바이스, 문자 디바이스 등등

 

드라이버와 관련된 내용들을 다룰 때 중요해짐!!

 

파일 시스템에 대한 이론적인 내용은 여기를 참조(간단하게 보기 좋다!)

https://wikidocs.net/231660

 

11 파일시스템 관리

파일시스템은 운영체제에서 데이터를 저장, 관리, 검색하는 방법을 제공하는 중요한 구성 요소입니다. 파일시스템은 디스크나 다른 저장 매체에 데이터를 조직화하고 접근하는 구조와 규칙…

wikidocs.net

 

 

반응형