티스토리 뷰

창병모, 리눅스 프로그래밍 원리와 실제(생능출판, 2022)

5.1 시스템 호출

컴퓨터 시스템 구조

- 하드웨어는 CPU, 메모리, 저장장치, 주변장치 등으로 구성

- 운영체제는 하드웨어를 운영 관리하는 시스템 소프트웨어이며 유닉스/리눅스의 경우 커널(kernel)이 하드웨어를 운영 관리

 

운영체제 서비스

- 프로세스 관리

- 파일 관리

- 메모리 관리

- 통신 관리

- 주변장치 관리

 

시스템 호출

시스템 호출(system call) : 운영 체제가 제공하는 서비스에 대한 프로그래밍 인터페이스

 - 시스템 호출은 커널에 서비스를 요청하기 위한 프로그래밍 인터페이스로 응용 프로그램은 시스템 호출을 통해서 커널에 서비스를 요청 가능

 

시스템 호출 구현

 

 

5.2 파일

파일 열기와 파일 디스크립터

리눅스 파일

- 파일 디스크립터는 열린 파일을 나타내는 번호

int open(const char *path, int oflag, [ mode_t mode]);

- path가 나타내는 파일을 연다

- 성공하면 파일 디스크립터 반환, 실패하면 -1 반환

 

- oflag 매개변수는 위의 입출력 모드 중 하나를 지정해 주어야 함

- open() 시스템 호출을 파일을 열고 열린 파일의 파일 디스크립터를 반환

 

- 세 번째 매개변수 mode는 새롭게 만드는 파일의 접근권한으로 새로운 파일을 만드는 경우(O_CREAT)에만 사용

 

파일 생성과 파일 닫기

 

int creat (const char *path, mode_t mode);

- path가 나타내는 파일을 생성하고 쓰기 전용으로 연다

- 파일 생성에 성공하면 파일 디스크립터를, 실패하면 -1 반환

- open() 시스템 호출과 동일

 

int close(int fd);

- fd가 나타내는 파일을 닫음

 

파일 읽기 read()

 

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

- fd가 나타내는 파일에서 nbytes 만큼의 데이터를 읽어 buf에 저장

- 성공하면 읽은 바이트 수, 파일의 끝을 만나면 0, 실패하면 -1 반환

 

파일 쓰기 write()

 

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

- buf에 있는 nbytes 만큼의 데이터를 fd가 나타내는 파일에 쓴다

- 성공하면 실제 쓰여진 데이터의 바이트 수를 반환, 실패하면 -1 반환

 

파일에 블록 쓰기

- write() 시스템에서 유의할 점은 이 시스템 호출을 이용해 어떤 데이터든지 파일에 저장할 수 있다는 것

- 두 번째 매개변수 buf는 어떤 타입의 데이터이든지 상관없이 데이터를 저장하고 있는 곳의 시작주소(포인터)를 받을 수 있음

- 세 번째 매개변수 nbytes는 그 데이터의 크기를 받음

 

int i;
write(fd, &i, dizeof(int));

struct student record;
write(fd, &record, sizeof(record));

- 정수형 변수에 저장된 값을 그대로 파일에 저장할 수 있고, 구조체 변수 저장도 가능

 

- 파일에 연속된 바이트 형태로 저장된 변수의 값을 어떻게 그대로 복원 가능?

➡ read() 시스템 호출을 이용해 파일에 저장된 데이터를 연속된 바이트 형태로 읽어서 원래 자료형 변수에 순서대로 저장하면 원래 데이터 그대로 복원 가능

int i;
read(fd, &i, sizeof(int));

struct student record;
read(fd, &record, sizeof(record));

 

파일 디스크립터 복제 dup()

 

int dup(int oldfd);

- oldfd에 대한 복제본인 새로운 파일 디스크립터를 생성하여 반환

- 실패하면 -1 반환

 

int dup2(int oldfd, int newfd);

- oldfd를 newfd에 복제하고 복제된 새로운 파일 디스크립터 반환

- 실패하면 -1 반환

 

5.3 임의 접근

임의 접근과 파일 위치 포인터

- 파일 위치 포인터는 파일 내에 읽거나 쓸 위치인 현재 파일 위치를 가리킴

 

임의 접근 lseek()

 

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

- fd가 나타내는 파일의 현재 위치를 whence를 기준으로 offset만큼 이동시킴

- 성공하면 갱신된 현재 파일 위치 반환, 실패하면 -1

 

 

임의 접근을 이용한 레코드 수정

(1) 파일로부터 해당 레코드 읽기

(2) 레코드 수정

(3) 수정된 레코드 다시 파일 내의 원래 위치에 쓰기

- 레코드를 읽으면 현재 파일 위치가 자동으로 그 만큼 이동한다는 점에 주의

 

Comments