시스템 콜 (open, close, read, write)

김현송·2023년 5월 11일
0

리눅스

목록 보기
4/7

OS가 제공하는 서비스들

  • 프로세스
  • 메모리 할당
  • 파일 내용
  • 파일 이름, 디렉토리
  • 엑세스 컨트롤(보안)
  • 기타 (유저, IPC, 네트워크, 타임, 터미널)

위 서비스들을 사용하기 위해서 OS 위에서 동작하는 응용프로그램들은 시스템 콜이라는 함수를 사용해야 합니다.

시스템 콜의 종류는 무수히 많지만 기본적인 시스템 콜에 앞서, File Descriptor에 대해 알아보도록 하겠습니다.

File Descriptor(FD)

운영체제가 파일이나 기타 입/출력 리소스에 액세스하는데 사용되는 인덱스 번호입니다.

FD - 0 : 표준 입력
FD - 1 : 표준 출력
FD - 2 : 표준 에러

파일 오픈 또는 소켓 생성 시 부여되는 FD는 3부터 시작합니다.

시스템 콜 open은 FD값을 반환합니다.

open()

  • 파일을 열 때 사용하는 시스템 콜 입니다.
int open(const char *pathname, int flags, mode_t mode);
  • pathname : 파일의 경로를 지정하는 문자열

  • flags : 파일을 열 때 동작을 지정하는 플래그 값 '|' 연산자를 통해 함께 지정이 가능합니다.

    • O_RDONLY: 파일을 읽기 전용으로 엽니다.

    • O_WRONLY: 파일을 쓰기 전용으로 엽니다.

    • O_RDWR: 파일을 읽기와 쓰기 모드로 엽니다.

    • O_CREAT: 파일이 존재하지 않을 경우 새로운 파일을 생성합니다.

    • O_TRUNC: 파일이 존재할 경우 파일의 크기를 0으로 잘라내고 엽니다.

    • O_APPEND: 파일을 열 때 파일의 끝으로 이동한 후에 쓰기 작업을 수행합니다. 즉, 기존의 내용 뒤에 새로운 내용을 추가합니다.

    • O_EXCL: O_CREAT와 함께 사용할 때, 이미 파일이 존재하는 경우 에러를 발생시킵니다.

  • mode : 파일의 생성 권한을 지정하는 값 입니다.

    • S_IRUSR: 사용자가 읽기 권한을 갖도록 지정하는 매크로. 0400과 같습니다.
    • S_IWUSR: 사용자가 쓰기 권한을 갖도록 지정하는 매크로. 0200과 같습니다.
    • S_IRGRP: 그룹이 읽기 권한을 갖도록 지정하는 매크로. 0040과 같습니다.
    • S_IWGRP: 그룹이 쓰기 권한을 갖도록 지정하는 매크로. 0020과 같습니다.
    • S_IROTH: 다른 사용자가 읽기 권한을 갖도록 지정하는 매크로. 0004와 같습니다.
    • S_IWOTH: 다른 사용자가 쓰기 권한을 갖도록 지정하는 매크로. 0002와 같습니다.

close()

close() 함수는 성공하면 0을 반환하고, 실패하면 -1을 반환합니다. FD를 닫는 데 실패한 경우, errno 변수에 오류 코드가 저장됩니다. FD를 닫으면 해당 파일에 대한 모든 연결이 끊어지며, 더 이상 파일을 읽거나 쓸 수 없습니다. FD는 유한한 자원이므로, 사용한 FD는 반드시 닫아주어야 합니다.

read()

  • FD에서 데이터를 읽어오는 함수입니다.

    파일 디스크립터에서 읽을 데이터의 크기와 버퍼의 주소를 인자로 받습니다. 해당 버퍼 크기만큼 파일을 읽으며 파일 포인터가 이동합니다.
    중요한 점은 read 함수 호출 이후에도 파일 오프셋(포인터)는 변하지 않습니다.
    예를들어 200바이트 크기의 파일이 있다고 가정할 때,

char buf[100];
ssize_t nread1 = read(fd, buf, 100);  // 첫 번째 호출
ssize_t nread2 = read(fd, buf, 100);  // 두 번째 호출

를 실행했을때, 동일한 첫 100바이트를 읽는것이 아닌 100바이트 이후의 100바이트를 연속해서 읽게 됩니다.

write()

  • FD에 해당하는 파일에 데이터를 쓰는 함수입니다.
#include <unistd.h>

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

반환 값은 ssize_t 형식으로 정수형입니다.

구현 및 분석

https://github.com/kimhyunsong/kdt_linux_system

profile
안녕하세요

0개의 댓글