본문 바로가기
한국으로/임베디드 리눅스

1.6 파일 입출력

by 영킴. 2018. 6. 27.

1.6 파일 입출력

1.6.0 main()

$ ls -l /home/user 를 main()함수는 어떻게 인식할까?

int main(int argc, char** argv)





1.6.1. 파일 식별자

각 프로세스마다 File Descriptor(파일 식별자)가 존재.
fd = open("test.txt", O_RDWR);  //int 형 파일식별자가 배정됨.

하나의 프로세스는 동일한 파일을 여러번 열 수 있다.
여러 프로세스가 하나의 파일을 동시에 열 수 있다.
디바이스 드라이버, 파이프, 소켓 등도 파일 식별자를 통해 파일처럼 액세스!


1.6.2 저수준 파일 입출력 함수

int open(const char* pathname, int flags);

int open(const char* pathname, int flags, mode_t mode);

기능: 파일열기
리턴: 성공 시 fd (파일 식별자), 에러 시 errno 설정 후 -1 리턴
pathname: 파일 이름
flags: 필수옵션 - O_RDONLY, O_WRONLY, O_RDWR;  옵션 - O_CREAT, O_CREAT|O_EXCL, O_NONBLOCK
mode: 접근권한

ssize_t read(int fd, void* buf, size_t count);

기능: 파일로부터 데이터 읽기
리턴: 성공 시 읽은 데이터의 바이트 수, 에러 시 errno 설정 후 -1 리턴, 파일 끝인 경우 0 리턴
fd: 파일 식별자
buf: 읽은 데이터를 여기에 저장
count: 읽을 데이터 바이트 수 (최대값)

ssize_t write(int fd, const void* buf, size_t count);

기능: 파일에 데이터 쓰기
리턴: 성공 시 쓴 데이터의 바이트 수, 에러 시 errno 설정 후 -1 리턴, 아무것도 못쓰면 0 리턴
fd: 파일 식별자
buf: 여기에 데이터를 쓰기
count: 쓸 데이터 바이트 수 (최대값)

int ioctl(int fd, int request, ...);

기능: 디바이스 제어
리턴 성공 시 0 이나 0 이상 정수 리턴, 에러 시 errno 설정 후 -1 리턴
request: 디바이스 명령 코드

int fcntl(int fd, int cmd, ...);

기능: 열린 파일 제어
리턴: 성공시 cmd 결과값, 에러 시 errno 설정 후 -1 리턴
cmd: 명령
... : 명령 인자

off_t lseek(int fd, off_t, offset, int whence);

기능: 파일 I/O 옵셋 위치 제어
리턴: 성공시 옵셋 위치를 바이트 단위로 리턴, 에러 시 errno 설정 후 -1 리턴
offset: whence에 따름
whence: 
SEEK_SET(옵셋 위치가 offset으로 이동), 
SEEK_CUR(옵셋 위치를 현재 위치 + offset으로 이동), 
SEEK_END(옵셋 위치를 전체 크기 + offset 으로 이동)

int close(int fd);

기능: 파일 닫기
리턴: 성공시 0 리턴, 에러 시 errno 설정 후 -1 리턴



1.6.3 고수준 파일 입출력 함수

FILE* fopen(const char* path, const char* mode);

기능: 스트림 열기
리턴: 성공시 스트림 주소, 에러 시 errno 설정 후 NULL 리턴
path: 파일 이름의 절대 경로 또는 상대 경로
mode: r, r+, w, w+, a, a+

int fclose(FILE* stream);

기능: 스트림 닫기
리턴: 성공 시 0, 에러시 errno 설정 후 EOF(-1) 리턴

size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream);

기능: 스트림 읽기
리턴: 성공시 nmemb, 에러 시 또는 파일의 끝일 때 nmemb 미만의 정수 리턴, 에러는 feof(), ferroer() 활용하자
size: 한 아이템의 바이트 수
nmemb: 아이템의 수

size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream);

기능: 스트림 쓰기
리턴: 성공 시 nmemb, 에러 시 nmemb 미만의 정수 리턴
size: 한 아이템의 바이트 수
nmemb: 아이템의 수

char* fgets(char* s, int size, FILE* stream);

기능: 스트림으로부터 문자열 읽기 (최대 size-1개의 문자, 맨 끝에 NULL문자가 포함됨), 줄바꿈 또는 파일의 끝이면 읽기 중단함 (줄바꿈 문자도 읽는다)
리턴: 성공 시 s, 에러 시 또는 파일의 끝일 때 NULL 리턴
s: 문자열을 저장할 메모리의 시작 주소
size: 읽을 문자의 바이트 수 (맨 끝에 NULL문자가 포함되므로 최대 size-1개의 문자를 읽음)

int fputs(const char* s, FILE* stream);

기능: 스트림에 문자열 쓰기 (마지막 NULL 문자는 쓰지 않는다)
리턴: 성공 시 음수 외의 값, 에러 시 EOF(-1) 리턴
s: 쓸 문자열의 시작 주소



'한국으로 > 임베디드 리눅스' 카테고리의 다른 글

3.2 세마포어  (0) 2018.06.27
3.1 파이프  (0) 2018.06.27
2.2 시그널  (0) 2018.06.27
2.1 프로세스  (0) 2018.06.27
1.5 응용 프로그램  (0) 2018.06.26
1.4 개발환경 구축  (0) 2018.06.26
1.3 vi/vim editor  (0) 2018.06.26
1.2 리눅스 명령어  (0) 2018.06.26