파일 디스크립터란 뭔가?!
파일 디스크립터는 파이프, FIFO, 소켓, 터미널, 디바이스, 일반파일 등 종류에 상관없이 모든 열려있는 파일을 참조할때 쓴다.
파일디스크립터 |
목적 |
POSIX 이름 |
stdio 스트림 |
0 |
표준 입력 |
STDIN_FILENO |
stdin |
1 |
표준 출력 |
STDOUT_FILENO |
stdout |
2 |
표준 에러 |
STDERR_FILENO |
stderr |
표에 있는 3가지 디스크립터는 프로그램이 시작할때 셸의 디스크립터의 복사본을 상속 받고, 셸은 보통 3가지 파일 디스크립터가 언제나 열린채로 동작 한다.
프로그램에서 파일 디스크립터를 참조할때는 번호(0,1,2)를 쓸 수도 있지만 가능하면 "UNISTD.H"에 정의된 POSIX 이름을 쓰는편이 좋다..
fd = open( pathname, flags, mode ) // pathname 이 가리키는 파일을 열고 열린 파일을 이후 호출에서 참조 할 때 쓸 파일 디스크립터를 리턴. // flags는 파일을 읽기, 쓰기, 둘다를 위해 열지를 지정 한다. numread = read( fd, buffer, count ) // fd가 가리키는 파일에서 최대 count 바이트를 읽어 buffer에 저장. numwritten = write( fd, buffer, count ) // 버퍼에서 최대 count 바이트를 fd가 가리키는 열려 있는 파일에 쓴다. status = close(fd) 모든 i/o 를 마친뒤 fd와 관련 커널 자원을 해제 한다.
파일 디스크립터와 열려 있는 파일의 관계
각 프로세스별로 커널은 open file descriptor table 을 갖고 있다. 테이블의 각 엔트리는 하나의 파일 디스크립터에 대한 동작 제어 플래그, 열린 파일을 가리키는 참조를 담고 있다.
open file description은 현재 파일의 offset, flag, 접근 모드, i/o 관련 설정, 파일의 i-node 객체를 가리키는 레퍼런스를 갖고 있다.
i-node는 파일 종류 (일반파일, 소켓, fifo)와 권한, lock 목록 포인터, 여러 파일 오퍼레이션과 다양한 파일 속성(크기, 타임스탬프등)을 갖고 있다.
만약 같은 open file description을 가리키는 2개의 fd는 offset값을 공유 한다.
'프로그래밍 > 리눅스' 카테고리의 다른 글
I/O 모델 종류.. (0) | 2013.03.24 |
---|---|
프로세스 (0) | 2013.03.24 |
소켓 : 유닉스 도메인 (0) | 2013.03.20 |
리눅스 API의 모든것 (0) | 2013.03.20 |
리눅스에서 안드로이드 테더링 (0) | 2013.03.20 |