컴공 전공 공부
[2]File IO: Standard I/O Library 본문
*System Calls - 운영체제 내 존재하는 인터페이스
- they are entry points into kernel code where their functions are implemented
*Library Calls - 운영체제 밖에 존재하는 인터페이스
- they are transfers to user code which performs the desired functions
- A set of compiled object functions for reuse
-located in /lib of in /usr/lib
-only necessary functions will be linked to the user program
*Types of libraries
1. Shared library
-하나의 메모리에 하나의 프로그램이 존재하며, 메모리를 효율적으로 사용가능하다.
-항상 메모리에 상주 후 공유하여 메모리 효율이 높지만 실행 안해도 메모리 점령 문제가 발생한다.
-server system에 유용
2. Static library
-모든 프로그램에 기능을 하는 코드가 다 중복되서 들어가기 때문에 메모리 오버헤드가 발생할 수 있다.
-link / jump 동작이 없어 조금더 효율적이지만 메모리 효율성이 낮다.
-embedded system에 유용: 프로그램이 많지 않은 임베디드 시스템에 사용한다.(속도를 높이기 위해)
*OS System calls for I/O
- File descripter사용
-하나의 파일은 하나의 숫자로 i/o실행됨
*Standard I/O library call
-File stream 사용( FILE * )
*Library buffering
: 데이터를 임시 저장할 수 있는 공간으로 실제 library call에 비해 줄일 수 있다.
1. FULL BUFFERING
: 큰 크기의 I/O를 사용해 효율성을 높임 ->데이터를 잃어버릴 가능성이 큼
-ffush()를 사용해서 버퍼를 지우지 않은 상태라도 바로 쓸 수 있음
-stderr/ stddin/ stdout제외한 모든 경우에서 사용
2. LINE BUFFERING
:\n이 나올 때까지 buffer에 넣어둠
-빈번한 user레벨과의 i/o call발생하여 횟수 증가->성능 떨어짐
-getchar() problem : 데이터를 잃어버릴 수 있지만 버퍼크기가 낮아 메모리 낭비가 낮다.
-stddin/ stdout에서 사용
3. Unbuffering
: library call 사용 x ->메모리 낭비가 없으며, library call을 할 때마다 system call 발생하여 성능이 낮아지지만 안전하게 데이터를 사용할 수 있다.
-stderr에서 사용
*Kernel buffering
-운영체제 내부에도 데이터를 저장하는 버퍼가 존재하는 것
*fflush와 printf차이점
- printf(" "); ->버퍼에만 존재
-fflush(stdout); ->실제적으로 내려주며 무조건 출력을 보장한다. librarycall->system call로 내려줌
*sync()
- kernel레벨에서 disk로 완전히 내려줌
*File offset
: 파일을 읽거나 쓸 때 어디부터 시작할 지 나타내는 시작점
1.FILE이 reading/writing으로 열리는 경우 - offset은beginning of the file
-reading/writing하는 동안 offset은 자동적으로 증가
2.FILE이 appending으로 열리는 경우 - end of the file
*File Access Methods
-Sequential access :자동적/순차적으로 증가
-Random access :offset 위치를 원하는 곳으로 변경
library function에서는 fseek()사용
system call에서는 lseek()사용
*file offset을 변경시키는 함수
-fseek: 작업이 일어난 위치로 돌아감
-rewind: 파일의 처음으로 돌아감
-ftell: 현재 위치 반환
*File error check
-ferror: 발생한 error에 대한 number 반환 /error가 없을 시에는 0 반환
-feof: 맨 마지막에 위치했는지 확인
-clearerr: 발생한 error를 지우라는 것
*Error handling 함수
1)strerror
#include <string.h>
char *strerror(int errnum) // 특정 num에서 어떤 error인지 확인 에러메세지를 반환
2)perror
#include <stdio.h>
void perror(const char *msg) //가장 최근 발생한 에러를 넘겨줌
'시스템 프로그래밍' 카테고리의 다른 글
| [3] 시스템프로그래밍 -FILE IO(2) (0) | 2022.06.11 |
|---|