-
[get_next_line] 배경지식(정적변수, 파일디스크립터)42Seoul 2022. 7. 14. 15:26
정적변수(static variable)
선언 방법은 앞에 static 이라는 수식어를 붙이면 된다.
static int Number1; int main() { static int Number2; ... }
특징은 다음과 같다.
- 초기화하지 않아도 자동으로 0으로 초기화
- 프로그램이 시작될 때 할당, 끝날 때 파괴 > 함수 내에서 값 변화시키고 함수 종료 되어도 값 변화 X
- 전역으로 선언 시 소스파일 내 모든 함수에서 사용 가능(해당 소스파일 안에서만 사용 가능하니 정보은닉효과)
- 함수 내부에 선언 시(내부정적변수) 다른 함수에서는 참조 불가, 그러나 함수 시작이 아닌 프로그램 시작 시 할당되므로 함수 여러번 실행되어도 내부정적변수의 초기화는 한 번만
- 매개변수로 사용할 수 없음
이러한 특징은 정적변수는 메모리의 data영역에 저장되기 때문이다(+ 전역변수).
(<-> 일반적인 지역변수는 stack에 저장, 함수 호출 시 메모리에 할당되며 종료 시 사라짐)
파일디스크립터(file descriptor)
- 시스템으로부터 할당받은 파일을 대표하는 0이 아닌 정수 값
- 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스
유닉스 시스템의 모든 것은 파일이다. 시스템에서 프로세스가 이 파일들에 접근할 때 파일 디스크립터를 이용한다.
프로세스가 실행 중 파일을 open하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중 사용하지 않는 가장 작은 값을 할당한다.
그 다음, 열려있는 파일에 프로세스가 시스템콜을 통해 접근할 때, 파일디스크립터 값을 이용해 파일을 지칭할 수 있다.
프로그램이 프로세서로 메모리에서 실행 시작할 때 기본 할당되는 FD
표준입력(standard input), 표준출력(standard output), 표준에러(standard error) (각각 0, 1, 2)
(POSIX 표준에서는 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO로 참조됨(unistd.h)
FD는 0~OPEN_MAX(플랫폼에 따라 상이)
파일디스크립터가 숫자인 이유는 프로세스가 유지하고 있는 FD 테이블의 인덱스이기 때문이다.
FD 테이블의 각 항목은 FD 플래그와 파일 테이블로의 포인터를 가지고 있으며, 이 포인터를 이용하여 FD를 통해 시스템의 파일을 참조할 수 있는 것이다.
작동 방식
fd는 해당 프로세스의 open file 을 관리하는 구조체 배열의 index
그 구조체의 index 가 가리키는 객체가 dentry 라는 객체이고, 그 dentry 객체는 또다시 해당 파일을 나타내는 inode 객체를 가리킴
커널 구조체중 struct files_struct 에는 struct file fd_array 라는 배열이 있음
실제로 open()을 통해 얻는 fd 는 저 구조체의 index 를 나타냄일반적으로 0, 1, 2 index 는 std-in/std-out/error 와 관련된 fd 로 미리 할당이되고, 보통 open()을 하게 되면 fd 값은 3이 됨
3번 index로 test.txt 찾는 과정
- fd_array[3] 이 pointing 하고 있는 file 구조체의 f_dentry 를 얻어오게됩니다. dentry(directory entry)는 리눅스에서 디렉토리에 접근을 빠르게 하기 위한 구조체
- open() 시스템 콜을 호출 > test.txt 가 존재하는 위치와 관련되어 dentry 구조체가 만들어짐. dentry 구조체는 관련된 inode 구조체를 가리키는 필드를 포함
- 따라서 open("test.txt',...) 함수로 호출된 파일은 test.txt 에 대한 dentry 생성, inode 생성(또는 읽음) 후에 해당 프로세스의 open 파일 관리 구조체인 files_struct 의 fd_array 의 비어있는 위치에 test.txt 의 dentry 를 포인팅하고 그 index 인 3을 넘겨주는 것
- 이후 사용자가 3번을 가지고 시스템 콜을 수행하게되면, 해당 프로세스의 files_struct 의 fd_array index 를 통해서 관련 inode에 접근할 수 있게 됨
[ Linux ] File Descriptor(파일 디스크립터)
파일 디스크립터 시스템으로부터 할당 받은 파일을 대표하는 0이 아닌 정수 값 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스 유닉스 시스템에서 모든 것은 파일이다. Regularfile, Di
chunggaeguri.tistory.com
출처 http://dev.plusblog.co.kr/22 http://z-man.tistory.com/151 https://dev-ahn.tistory.com/96
'42Seoul' 카테고리의 다른 글
[born2beroot] 리눅스(Debian) 시스템/서버 관련 개념 (0) 2022.10.01 [Born2BeRoot] VDI, VHD, VMDK 포맷의 차이점, 디스크 이미지 파일 (0) 2022.09.20 [Born2BeRoot] 가상머신(Virtual Machine) (0) 2022.09.19 [42Seoul] ft_printf 구현의 이론적 배경 (0) 2022.08.02 [42Seoul] ft_printf : va_arg(), 바이트패딩에 대한 약간의 고찰 (0) 2022.07.30