System Call

kkjin722·2025년 4월 21일

System call은 사용자가 운영체제 커널은 안전하게 사용할 수 있는 역할을 준다. 디스크 I/O나 프로세스 생성 같은 중요한 자원 접근은 커널을 통하여서 접근이 가능하다. 비특권 모드와 특권 모드의 문맥전환을 담당한다.

System call의 예시들을 잘 살펴 보자면

Call() 함수

call()함수는 리눅스에서 파일 입출력을 가능하게 해주는 가장 기본적인 명령어이다.

#include <fcntl.h>

// 파일이 이미 있을 때
int open(const char *pathname, int flags);

// 파일이 없으면 만들고 싶을 때
int open(const char *pathname, int flags, mode_t mode);

int flags의 종류로써는

O_RDONLY : 읽기 전용

O_WRONLY : 쓰기 전용

O_RDWR : 읽기·쓰기 모두

파일 생성·상태 플래그 (선택)

O_CREAT : 파일이 없으면 새로 생성

O_TRUNC : 파일 열 때 기존 내용을 모두 지우고 새로 시작

O_APPEND : 쓰기 시 항상 파일 끝에 덧붙이기

O_EXCL : O_CREAT와 함께 쓰면, 파일이 이미 있을 때 에러

O_DIRECTORY, O_SYNC 등 다양한 부가 옵션

등이 있다.

만약에 반환이 성공한다면 0보다 큰 수가 나오고, 실패한다면 -1의 값이 나온다.

Read() 함수를 살펴 본다면

#include <unistd.h>

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

fd는 파일 디스크립터이다. 0은 읽기, 1은 쓰기 이다. open으로 얻은 값이나 표준 입력 0, 표준 출력이 아닌 읽기용 디스크립터를 넘겨준다.

buf는 읽어 온 데이터를 저장할 버퍼의 시작 주소이다.

count는 읽어 오려는 최대 바이트 수이다.

write() 함수를 살펴 본다면

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

→ 버퍼(buf)의 데이터를 파일(fd)에 최대 count 바이트만큼 써준다는 의미이다.

profile
테니스 치는 개발자

0개의 댓글