◎위챗 : speedseoul
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
int
main(
void
) {
int
fd1, fd2, fd3;
fd1 = socket(PF_INET, SOCK_STREAM, 0);
fd2 = open(
"test.dat"
, O_CREAT | O_WRONLY | O_TRUNC);
fd3 = socket(PF_INET, SOCK_DGRAM, 0);
printf
(
"file descriptor 1: %d\n"
, fd1);
printf
(
"file descriptor 2: %d\n"
, fd2);
printf
(
"file descriptor 3: %d\n"
, fd3);
close(fd1);
close(fd2);
close(fd3);
return
0;
}
파일 디스크립터(File Descriptor)
- 운영체제가 만든 파일 또는 소켓을 지칭하기 위해 부여한 숫자
- 파일을 관리하기 위한 운영체제가 필요로 하는 파일의 정보를 가지고 있다. FCB(File Control Block)이라고 하고 다음의 정보를 가진다.
1) 파일 이름
2) 보조 기억 장치에서의 파일 위치
3) 파일 구조 : 순차 파일, 색인 순차 파일, 색인 파일
4) 액세스 제어 정보
5) 파일 유형
6) 생성 날짜와 시간, 제거 날짜와 시간
7) 최종 수정 날짜 및 시간
8) 액세스한 횟수
- 파일 디스크립터는 정수형으로 차례로 부여되고 0, 1, 2는 이미 할당되어 있어서 3부터 부여된다.
파일 디스크립터 | 대 상 |
0 | 표준입력: Standard Input |
1 | 표준출력: Standard Output |
2 | 표준에러: Standard Error |
파일 디스크립터와 소켓
- 리눅스 환경에서는 소켓조작과 파일조작이 동일하게 간주되기 때문에 자세히 알 필요가 있다.
- 리눅스는 소켓을 파일의 일종으로 구분하여 파일 입출력 함수를 소켓 데이터 송수신에 사용할 수 있다.
리눅스 환경에서 소켓 & 파일입출력의 파일 디스크립터 예시
fd_seri.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/socket.h> int main( void ) { int fd1, fd2, fd3; fd1 = socket(PF_INET, SOCK_STREAM, 0); fd2 = open( "test.dat" , O_CREAT | O_WRONLY | O_TRUNC); fd3 = socket(PF_INET, SOCK_DGRAM, 0); printf ( "file descriptor 1: %d\n" , fd1); printf ( "file descriptor 2: %d\n" , fd2); printf ( "file descriptor 3: %d\n" , fd3); close(fd1); close(fd2); close(fd3); return 0; } |
- 실행결과
실행결과에서 보이듯이 파일 입출력 함수인 open과 socket 둘중 어떤 것을 써도 파일 디스크립터가 순차적으로 증가하는 것을 알 수 있다.
출처: https://dsit.tistory.com/2 [일상IT]