본문 바로가기

프로그래밍/C language

8. The UNIX System Interface

8.1 File Descriptors

 

- Unix OS에서 표준 입/출력은 모두 실제로 file로 구현됨

- 읽기/쓰기 등의 작업을 위해, OS에 실제로 입/출력 파일이 존재하는지, 그 권리가 있는지 등을 확인 받으면 OS는 non-negative integer인 file descriptor값을 반환함

- file descriptor는 그러한 파일들을 식별하는 identifier임, 0는 표준입력, 1은 표준출력, 2는 표준에러출력

- 일반적으로, 0은 keyboard, 1과 2는 screen 으로 설정되어 있으며, shell에서 명령어를 통해 변경가능

 

ex) prog <file1 >file2

//file descriptor 0을 file1으로, file descriptor 1을 file2 로 지정

//이렇게 되면, 프로그램 실행시 표준 입/출력이 file1과 file2가 됨

 

8.2 Low Level I/O - Read and Write

 

- 특정 바이트만큼 입력/출력을 받기 위해 Read, Write함수를 사용할 수 있음

- fgets/fputs과 같은 것은 String단위 입/출력이므로 High Level I/O, read/write는 byte단위 입/출력이므로 Low Level I/O임

- Low Level I/O가 속도가 더 빠르며, 일반파일이 아닌 특수파일 읽고쓸때 사용

 

ex)

int n_read = read(int fd, char *buf, int n); // fd : file descriptor, buf : character array, n : the number of bytes

int n_write = write(int fd, char *buf, int n);

 

#define BUFSIZ 1024 // physical block size of peripheral device

 

char buf[BUFSIZ];

 

n = read(0, buf, BUFSIZ) // 1024byte만큼을 file descriptor 0을 buf로 지정하여 읽어옴

write(1, buf, n) // 읽어온 byte만큼을 file descriptor 1을 buf로 지정하여 씀

 

8.3 Open, Creat, Close, Unlink

 

- Open은 파일에 read/write를 할 수 있도록 여는 함수

- Close는 파일에 read/write가 끝난 후 닫는 함수, 동시에 열 수 있는 파일의 갯수는 한계가 있음

- Creat는 파일을 생성하는 함수, 동일한 이름의 파일이 있다면 지우고 새로 만듬

- Unlink는 파일을 삭제하는 함수

 

ex)

int open(char *name, int flags, int perms); //파일 없을경우 -1반환, file descriptor반환, flags는 읽기/쓰기/읽기쓰기 모드 선택, perms는 권한 (보통 0)

close(int fd); // free the file descriptor

int creat(char *name, perms); // 파일 생성, perms는 권한설정이며 0755와 같은 3자리의 8진수로 설정

unlink(char *name); // 파일 삭제

 

8.4 Random Access - Lseek

 

- Read/Write는 이전에 파일의 읽기/쓰기 후 바로 다움 위치에 위치한것을 읽거나 씀

- 파일 상의 특정 위치 지정하여, 읽기/쓰기를 하고 싶다면 lseek함수를 이용하여 위치를 지정

 

ex)

long lseek(int fd, long offset, int origin); //orgin = 0,1,2, 순으로 파일 시작,중간,끝 위치

 

lseek(fd, 2L, 0); // L은 long type이라는 뜻, 파일 시작점을 기준으로 offset 2만큼 이동한 위치로 read/write할 위치를 지정

read(fd, buf, n); // lseek으로 지정한 위치부터 n byte만큼 읽음

 

8.5 Example - An Inplementation of Fopen and getc

 

- 표준 라이브러리내부 함수를 위해서만 사용되는 이름은 user's program과 충돌을 방지하기 위해 _로 시작하는 관습이 있음(ex) _iob, _READ 등)

- fp = fopen(name, mode)에서 fopen은 내부적으로, open과 creat함수를 사용하여 파일을 생성하고 엶

- getc(fp)에서 fp(file pointer)는 내부적으로 struct형태를 가지며, file pointer는 file descriptor, 열기 모드(flag), character position등 정보를 가짐

- getc(fp)는 그러한 파일에 대한 정보를 가지는 fp를 이용하여 buffer에서 문자를 얻음

- 이러한 정보들은 <stdio.h> 표준 헤더에서 찾을 수 있음

 

8.6 Example - Listing Directories

 

- UNIX System에서 디렉토리는, file name과 inode(파일의 위치정보를 담고있는 테이블의 index)정보를 가지는 파일임

- 디렉토리의 size를 알기 위해서 fsize함수를 사용, 이는 command line에서 ls명령어와 동일한 역할을함

- 디렉토리의 경우, fsize함수는 내부에 디렉토리가 존재할 경우 recursive하게 내부를 탐색함

- size가 아닌 다른 정보를 얻고 싶을 경우, readdir, opendir, closedir함수를 이용해 파일을 열어서 정보를 수집해야함

- system independent한 부분과 system dependent한 부분의 프로그램을 따로 구현함으로서, 가용성이 증대됨

 

8.7 Example - A Storage Allocator

 

- 메모리상에는, malloc힘수를 이용하여 동적으로 할당 할 수 있는 block들과 그렇지 않은 block들이 있음

- 할당이 가능하지만, 사용중이지 않은 블록들은 물리적으로 인접하지 않은 상태로 논리적으로 linked-list와 같은 형태로 연결되어 있음

- malloc의 algorithm은 내부적으로 first fit으로, 충분한 크기를 가진 가장 먼저 발견된 block을 할당하고, 남은 공간을 다시 반환함

- malloc에서 사용하는 공간은, block내부에서 다음 free block을 가리키는 pointer와 block의 size를 담고있는 구조체 header부분을 제외한 나머지 부분이며,

이 나머지 부분의 가장 앞부분이 user에게 반환되는 주소임

- malloc 또한, system에 메모리를 요구해야 하기 때문에 system dependent 부분과 system independent 부분으로 나누어 구현됨

'프로그래밍 > C language' 카테고리의 다른 글

7. Input and Output  (0) 2021.08.19
6. Structures  (0) 2021.08.14
5. Pointer and Arrays  (0) 2021.08.11
4. Function and Program Structure  (0) 2021.03.29
3. Control Flow  (0) 2021.03.29