컴공 전공 공부

[2]File IO: Standard I/O Library 본문

시스템 프로그래밍

[2]File IO: Standard I/O Library

HUFS_COMPUTERPROGRAMER 2022. 6. 11. 01:05

*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