카톡
◎위챗 : 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]