리눅스 시스템 프로그래밍 - System Call

밍's 성장일지·2023년 8월 23일
0
post-custom-banner

커널이란?

  • 운영체제 중 메모리에 올라가 있는 운영체제의 핵심 부분으로 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하는 역할을 하며 컴퓨터 자원들을 관리하는 역할을 한다.

    즉, 커널은 인터페이스로써 응용 프로그램 수행에 필요한 여러가지 서비스를 제공하고, 여러가지 하드웨어(CPU, 메모리) 등의 리소스를 관리하는 역할

API란?

  • 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스


System Call 과 POSIX

POSIX : OS가 App에게 제공하는 API들의 표준
System Call : 리눅스가 App 개발자들을 위해 제공하는 API


System Call

리눅스 App이 리눅스 커널에게 어떤 부탁을 하기위해 만들어진 API를 System Call이라고 함.

printf, scanf 또한, System Call로 만들어짐.

파일처리하는 API

1) open( ) : fopen이 사용하는 syscall
2) read( ) : fscanf가 사용하는 syscall
3) write( ) : fprintf가 사용하는 syscall
4) close( ) : fclose가 사용하는 syscal


파일 디스크립터

  • 한 프로그램이 파일에 접근하려고 할 때, 부여되는 정수
    파일 시스템과 입출력 작업을 다룸

int open(path, flag, mode)

아래와 같은 옵션이 존재
• O_RDONLY
• O_WRONLY
• O_RDWR
• O_CREAT : 없으면 새로 생성
• O_APPEND : 덧붙이기
• O_TRUNC : 파일 내용 제거 후 사용

int source_fd = open("source.txt", O_RDONLY);
    // 소스 파일 열기
  
// 표준 출력 파일 디스크립터를 열린 파일로 재지정
int new_stdout = open("output.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
  
// S_IRUSR : 소유자에 대한 읽기 권한
//S_IWUSR : 소유자에 대한 쓰기 권한  

close(fd)
파일디스크립터만 적는다.
file descriptor : OS가 임시적으로 특정 파일에 붙여준 정수형 값
open( ) API를 사용하면 커널에서 파일 구조체와 fd가 생성


open은 error가 찾기 때문에 Error 처리에 대한 로그메세지 남기자!

exit(0) : return 값 0, 정상종료
exit(1) : return 값 1, 오류로 인한 종료 

error 메세지 매크로

FILE : 에러 file 이름
LINE : 에러 line 번호

#include <stdio.h>
#include <stdlib.h>

#define ERROR(msg) do { \
    fprintf(stderr, "Error in %s at line %d: %s\n", __FILE__, __LINE__, msg); \
    exit(EXIT_FAILURE); \
} while (0)

int main() {
    FILE *file;
    
    file = fopen("nonexistent_file.txt", "r");
    if (file == NULL) {
        ERROR("Failed to open file");
    }
    
    fclose(file);
    
    return 0;
}

디버깅 및 오류 처리를 더 효과적으로 수행하는 데 도움이 됨.


파일 offset

  • 저장장치에서 어디까지 읽었는지 Offset 값을 가지고 있음.
read(fd, buf, 10);
  // fd는 파일 디스크립터, buf는 읽은 데이터를 저장할 버퍼, 10은 읽을 최대 바이트 수

read(fd, buf, 10)를 호출 후 파일 오프셋이 이동하게 됨

lseek

  • 기준점에서 offset 만큼 떨어져 있는 곳으로 파일 offset으로 옮기는 시스템콜

    off_t lseek(int fd, off_t offset, int whence);
    • off_t : 정수 (long), 음수가능
    • offset : 떨어져있는 곳
    • whence : 기준

    whence 기준
    • SEEK_CUR : 현재위치 에서 부터
    • SEEK_SET : 시작점 에서 부터
    • SEEK_END : 끝 지점에서 부터

profile
아자아자!
post-custom-banner

0개의 댓글