SW/리눅스

리눅스 시스템 "파일 입출력"에 대해 알아볼까요?

얇은생각 2018. 12. 23. 12:30
반응형

파일은 읽거나 쓰기 전에 열어야 합니다. 


커널은 파일 테이블이라고 하는 프로세스별로 열린 파일 목록을 관리하고 있습니다. 음이 아닌 정수 값인 파일 디스크립터로 인덱싱되어 있습니다. 각 항목은 열린 파일에 대한 정보를 담고 있습니다. 메모리에 복사된 inode를 가리키는 포인터와 각종 메타데이터(파일 위치, 접근 모드 등)가 포함되어 있습니다.


파일 디스크립터는 사용자 영역과 커널 영역 모두에서 프로세스 내의 고유한 식별자로 활용합니다. 파일을 열면 파일 디스크립터가 반환됩니다. 이 파일 디스크립터를 관련 시스템 콜의 첫 번째 인자로 넘겨 (읽기, 쓰기 등) 다양한 연산을 수행하는 것입니다.


파일 디스크립터는 int 자료형입니다. 각 리눅스 프로세스가 열 수 있는 최대 파일 개수는 정해져 있습니다. 파일 디스크립터로 음수를 허용하지 않습니다. 따라서 함수에서 발생한 에러는 -1을 사용합니다. 


프로세스에서 명시적으로 닫지 않는 이상 모든 프로세스는 최소한 0,1,2 라는 세 가지 파일 디스크립터를 열어두고 있습니다. 0,1,2는 차례대로 표준 입력, 출력, 에러입니다. 파이디스크립터 값을 직접 참조하는 대신 라이브러리는 선행처리기 정의를 제공합니다. 


파일 디스크립터는 단순히 일반 파일만 나타내지 않습니다. 장치 파일, 파이프, 디렉터리, 퓨텍스, FIFO, 소켓 접근에도 사용됩니다. 모든 것이 파일이라는 유닉스 철학에 따라 읽고 쓸 수 있는 모든 것은 파일 디스크립터를 통해 접근 가능한 것입니다.


자식 프로세스는 부모 프로세스가 소유한 파일 테이블의 복사본을 상속받습니다. 열린 파일, 접근 모드, 현재 파일의 오프셋 등을 담고 있는 목록은 동일합니다. 하지만 특정 프로세스에서 일어난 변화는 다른 프로세스의 파일 테이블에 영향을 미치지 않습니다.

반응형