-
[Linux] 파일 입출력 함수프로그래밍/리눅스 시스템 2024. 4. 14. 22:18
$ man 명령어 : 명령어, 함수들에 대한 설명 확인
: Shell command, system call, Linux library의 interface, header file, descriptioin을 확인할 수 있는 명령어
$ man [옵션] [검색할 매뉴얼 페이지 이름]
ex) open() Syscall에 대한 interface, header file을 보고 싶다면, $ man 2 open
- [옵션]
- -k : 키워드로 매뉴얼을 검색
- 1 : Linux Shell Command
- 2 : System Call
- 3 : Linux Library
open() : 파일 오픈
int open(const char* path, int flag, mode_t mode)
- 기능 : 파일 시스템에서 파일을 열어서 해당 파일에 대한 파일 디스크립터를 생성
- 입력값
- path : 열고자 하는 파일의 경로
- flag : 파일을 어떻게 열지를 지정하는 플래그, 필수옵션과 추가 옵션이 존재하며 두 옵션은 OR(|)기호로 연결한다.
- [flag 필수 옵션]
> O_RDONLY : 파일을 읽기 전용으로 연다.
> O_WRONLY : 파일을 쓰기 전용으로 연다.
> O_RDWR : 파일을 읽기 및 쓰기용으로 연다.
[flag 추가옵션]
> O_CREAT : 파일이 존재하지 않는 경우 새로운 파일을 새로 생성
> O_APPEND : 덧붙이기 (쓰기용과 달리, 기존 내용은 유지한 채, 파일의 끝에 추가하여 쓰기 작업을 수행)
> O_TRUNC : 파일 내용 제거 후 사용 (기존 파일의 내용을 모두 삭제하고 해당 파일 사용)
=> O_APPEND / O_TRUNC 없이 그냥 write()하는 경우, 기존 내용에 덮어쓰기 된다. - => flag 필수 옵션과 추가 옵션은 | 기호로 연결한다. ex) O_RDWR | O_CREAT
- mode : 파일 생성할 때 줄 권한. 8진수로 입력한다. 0x(user)x(group)x(other)
=> (000 ~ 777 = 0b000000000 ~ 0b111111111 = --- --- --- ~ rwx rwx rwx)
[참고] other에 대한 권한은 보안상의 정책으로 무시되는 경우도 있다.
- 반환값
> 성공시 : open한 파일의 파일 디스크립트(int 양의 정수)를 반환
> 실패시 : -1을 반환 - 필요 라이브러리
- #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
- #include <sys/types.h>
💡open() 함수를 통한 파일 열기는 어떠한 권한(rxw)이 필요 없다!
read() : 파일 읽기
ssize_t read(int fd, void buf[.count], size_t count)
- 기능 : fd에 해당하는 파일을 파일 오프셋 위치에서 부터 count 크기만큼 읽어서 buf에 저장한다.
- 입력값
- fd : 읽고자 하는 파일의 fd (open() 함수의 반환값)
- buf : 파일에서 읽은 내용을 저장할 char buffer
- count : 파일에서 읽고자하는 사이즈 (byte단위)
- 반환값
> 동작이 성공 : 읽은 바이트 수를 반환
> 오류 시 : -1 반환 - 필요 라이브러리 : #include <unistd.h>
💡"unistd" = "Unix Standard"
Unix 시스템에서 표준 입출력 함수나 파일 조작 함수 등을 정의하는 헤더 파일 중 하나
Unix 시스템에서 프로그램을 작성할 때, 파일 입출력이나 시스템 콜(System Call) 등을 다룰 때 주로 사용된다.
wite() : 파일 쓰기
ssize_t write(int fd, const void buf[.count], size_t count )
- 기능 : buf에 저장된 내용을 count만큼 fd의 파일 오프셋 위치에서부터 작성한다.
- 입력값
- fd : 쓰고자 하는 파일의 fd (open() 함수의 반환값)
- buf : 파일에 쓸 내용이 저장된 buffet의 주소
- count : 파일에 쓸 사이즈 (byte단위)
- 반환값
> 성공시 0
> 오류 시 -1 - 필요 라이브러리 : #include <unistd.h>
close() : 파일 닫기
int close(int fd)
- 기능
- 파일 디스크립터를 닫는 시스템 콜.
- 파일 디스크립터를 닫으면 해당 파일에 대한 모든 작업이 완료되며, 시스템 리소스가 해제된다.
- 파일을 열고 사용한 후에 반드시 호출되어야 한다.
- 입력값 fd : 닫고자 하는 파일의 디스크립트
- 반환값
> 성공시 : 0을 반환
> 실패시 : -1을 반환 - 필요 라이브러리 : #include <unistd.h>
ssize_t 자료형
- 정수형 데이터 타입이지만, OS의 bit 상관없이 개발을 할 수 있다는 이점을 가진다.
- 주로 시스템 콜에서 파일 입출력과 관련된 바이트 수를 나타내는 데 사용된다.
- 값의 범위
- 32-bit 시스템에서 : ssize_t의 최소값과 최대값이 int형과 같다. (-2^32 ~ 2^32-1)
- 64-bit 시스템에서 : 일반적으로 long형과 같은 크기를 가진다. (-2^64 ~ 2^64-1)
=> 64-bit 시스템에선, %lu를 이용 하여 출력한다! - 🚨하지만 플랫폼 및 컴파일러에 따라 다를 수 있으므로 실제 크기를 확인하기 위해 시스템의 헤더 파일을 참조하는 것이 좋다!
lseek() : 파일 오프셋 위치 이동
off_t lseek(int fd, off_t offset, int whence);
- 기능 : 기준점에서 offset 만큼 떨어져 있는 곳으로 파일 위치를 옮기는 시스템콜
- 입력값
- fd : offset을 옮길 파일 디스크립트
- offset : 이동할 바이트 수를 나타내는 파일 오프셋(offset) 값으로, whence가 기준이 된다.
(long, 음수도 가능하다, 음수 입력시 whence 위치로 부터 뒤로 이동한다.) - whence : 이동할 기준 위치를 나타내는 정수
- SEEK_SET(=0): 파일의 맨 처음 시작 위치부터 offset 바이트를 이동
- SEEK_CUR(=1): 현재 위치에서 offset 바이트를 이동 (파일 open후 처음에는 맨 처음이 cur위치이다.)
- SEEK_END(=2): 파일의 맨 끝 위치+1부터 offset 바이트를 이동 (=> offset = -1일 때, 맨 끝 문자열을 의미)
- 반환값 : 성공시 새로운 파일 위치(index)를 반환 / 실패시 -1
'프로그래밍 > 리눅스 시스템' 카테고리의 다른 글
[Linux Kernel] Device Driver : Timer (0) 2024.04.29 [Linux Kernel] Device Driver : proc file system (0) 2024.04.29 [Linux Kernel] Device File : Read, write (with ioctl) (0) 2024.04.29 [Linux Kernel] Device Driver 적재, Device File 생성 (0) 2024.04.29 [Linux] 멀티 Process, Signal, WDT (0) 2024.04.15