[리눅스 시스템 프로그래밍] 3. 파일 입출력, 3.1 파일 기술자(File Descriptors)

이번 장에서는 리눅스 시스템에서 제공하는 파일 입출력 시스템 호출에 관한 함수들을 소개합니다. 파일 I/O에 관한 리눅스 시스템 호출로 파일을 열어 데이터를 쓰거나 파일의 내용을 읽어오는 등의 작업을 할 수 있습니다. 대표적인 파일 I/O에 사용하는 시스템 호출에는 open, close, read, write, lseek 함수가 있습니다.

3.1 파일 기술자(File Descriptors)

리눅스 시스템에서는 프로세스가 파일 입출력을 위해 열려진 파일마다 파일 기술자를 참조합니다. 프로세스가 open 함수를 호출하면 리눅스 시스템의 커널에서는 기존의 파일을 열거나 새로운 파일을 생성하여 파일 기술자를 반환합니다. 파일 기술자는 부호가 없는 정수로 하나의 프로세스에서 파일 입출력을 수행하는 단위마다 유일한 번호를 보장합니다.

특히 리눅스 쉘에 동작하는 프로세스는 개발자 코드가 아닌 프로세스 형성 과정에서 표준 입력과 표준 출력, 표준 에러 파일을 열어주며 이들의 파일 기술자는 0, 1, 2번입니다. 이는 unistd.h에 매크로 상수로 정의하고 있는데 이들 상수 이름은 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO입니다.

// ex_filedescriptor.c
#include <unistd.h>
#include <stdio.h>
#include <limits.h>

int main()
{
    printf("STDIN_FILENO:%u\n",STDIN_FILENO);
    printf("STDOUT_FILENO:%u\n",STDOUT_FILENO);
    printf("STDERR_FILENO:%u\n",STDERR_FILENO);
    printf("FOPEN_MAX:%u\n",FOPEN_MAX);
    return 0;
}
[그림 3.1] 파일 디스크립터 관련 상수 확인
[그림 3.1] 파일 디스크립터 관련 상수 확인