한국어

네트워킹

온누리070 플레이스토어 다운로드
    acrobits softphone
     온누리 070 카카오 프러스 친구추가온누리 070 카카오 프러스 친구추가친추
     카카오톡 채팅 상담 카카오톡 채팅 상담카톡
    
     라인상담
     라인으로 공유

     페북공유

   ◎위챗 : speedseoul


  
     PAYPAL
     
     PRICE
     

pixel.gif

    before pay call 0088 from app



1. 파일 디스크립터

- 시스템으로부터 할당 받은 파일을 대표하는 0이 아닌 정수 값

- 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스



흔히 유닉스 시스템에서 모든 것은 파일이라고 한다. 일반적인 정규파일(Regular File)에서부터 디렉토리(Directory), 소켓(Socket), 파이프(PIPE), 블록 디바이스, 캐릭터 디바이스 등등 모든 객체들은 파일로써 관리된다. 유닉스 시스템에서 프로세스가 이 파일들을 접근할 때에 파일 디스크립터(File Descriptor)라는 개념을 이용한다.


파일 디스크립터는 '0이 아닌 정수', 'Non-negative Integer' 값이다. 즉, 음수가 아닌 0과 양수인 정수 값을 갖는다. (unsigned int 값이라고 보면 된다.) 프로세스가 실행 중에 파일을 Open 하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중에 사용하지 않는 가장 작은 값을 할당해 준다. 그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근 할 때, FD 값을 이용해 파일을 지칭 할 수 있다. 


프로그램이 프로세스로 메모리에서 실행을 시작 할 때, 기본적으로 할당되는 파일 디스크립터들이 있다. 바로 표준 입력(Standard Input), 표준 출력(Standard Output), 표준 에러(Standard Error)이다. 이 들에게 각각 0, 1, 2 라는 정수가 할당되며, POSIX 표준에서는 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO로 참조된다. 이 매크로는 <unistd.h> 헤더 파일에서 찾아 볼 수 있다. 

0이 아닌 정수로 표현되는 파일 디스크립터는 0 ~ OPEN_MAX 까지의 값을 가질 수 있으며, OPEN_MAX 값은 플랫폼에 따라 다르다.






파일 디스크립터는 위 그림을 보면서 개념 정리를 하면 좋다. 파일 디스크립터가 단순히 숫자인 이유는 프로세스가 유지하고 있는 FD 테이블의 인덱스이기 때문이다. FD 3번이라는 의미는 FD 테이블의 3번 항목이 가리키는 파일이라는 의미이다. FD 테이블의 각 항목은 FD 플래그와 파일 테이블로의 포인터를 가지고 있다. 이 포인터를 이용하여 FD 를 통해 시스템의 파일을 참조 할 수 있는 것이다.

프로세스는 이런 FD 테이블과 파일 테이블의 정보를 직접 고칠 수 없으며, 반드시 커널을 통해서 수정을 해야 한다.

파일 디스크립터란 뭔가?! [출처: http://z-man.tistory.com/151]

파일 디스크립터는 파이프, FIFO, 소켓, 터미널, 디바이스, 일반파일 등 종류에 상관없이 모든 열려있는 파일을 참조할때 쓴다.

파일디스크립터 

목적 

POSIX 이름 

stdio 스트림 

 0

 표준 입력

 STDIN_FILENO

 stdin

 1

 표준 출력

 STDOUT_FILENO

 stdout

 2

 표준 에러

 STDERR_FILENO

 stderr

 

표에 있는 3가지 디스크립터는 프로그램이 시작할때 셸의 디스크립터의 복사본을 상속 받고, 셸은 보통 3가지 파일 디스크립터가 언제나 열린채로 동작 한다.

프로그램에서 파일 디스크립터를 참조할때는 번호(0,1,2)를 쓸 수도 있지만 가능하면 "UNISTD.H"에 정의된 POSIX 이름을 쓰는편이 좋다..

 

1
2
3
4
5
6
7
8
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와 관련 커널 자원을 해제 한다.

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에 접근할 수 있게 되는 것입니다.

 

파일 디스크립터와 열려 있는 파일의 관계

각 프로세스별로 커널은 open file descriptor table 을 갖고 있다. 테이블의 각 엔트리는 하나의 파일 디스크립터에 대한 동작 제어 플래그, 열린 파일을 가리키는 참조를 담고 있다.

open file description은 현재 파일의 offset, flag, 접근 모드, i/o 관련 설정, 파일의 i-node 객체를 가리키는 레퍼런스를 갖고 있다.

i-node는 파일 종류 (일반파일, 소켓, fifo)와 권한, lock 목록 포인터, 여러 파일 오퍼레이션과 다양한 파일 속성(크기, 타임스탬프등)을 갖고 있다.

만약 같은 open file description을 가리키는 2개의 fd는 offset값을 공유 한다.



출처: https://dev-ahn.tistory.com/96 [Developer Ahn]
조회 수 :
435
등록일 :
2019.06.01
08:06:25 (*.214.125.21)
엮인글 :
http://webs.co.kr/index.php?document_srl=3319992&act=trackback&key=9d3
게시글 주소 :
http://webs.co.kr/index.php?document_srl=3319992
List of Articles
번호 제목 글쓴이 날짜 조회 수
117 Error : unary operator expected – 쉘스크립트 타입관련 문법 admin 2019-09-14 13
116 vi 에디터에서 ^M 문자 한번에 모두 지우기 ( ^M, ^L을 이해하자) admin 2019-06-20 341
115 데비안 제시 jessie 소스리스트 sourcelist admin 2019-06-17 298
» File Descriptor (파일 디스크립터) 설명 무엇인가 사용방법 admin 2019-06-01 435
113 Start / Stop and Restart Apache 2 Web Server Command 아파치 시작 스톱 명령어 admin 2019-04-08 539
112 DebianPackageManagement admin 2019-04-08 505
111 리눅스 우분투, 32비트 64비트 확인 명령어 admin 2019-01-06 1690
110 How to install a Debian 9 (Stretch) Minimal Server 데비안 9 설치 admin 2018-06-13 3353
109 Which is better, GCC or Clang? admin 2018-06-13 3090
108 고정ip설정, dns설정(데비안) linux 리눅스 admin 2018-06-13 3622
107 [리눅스] 부팅 시 자동 실행 프로그램 등록|작성자 나눔HN admin 2018-06-01 3634
106 리눅스 서버 유지보수 점검 메인터넌스 상황 파악 admin 2018-04-14 3710
105 Top 20 OpenSSH Server Best Security Practices 보안 대책 실제 적용 admin 2018-04-14 4340
104 Start Stop Restart Apache 2 Web Server Command Debian Ubuntu CentOS RHEL Fedora admin 2018-04-14 3008
103 리눅스 한글 2014 뷰어 다운로드 - hwpviewer admin 2018-03-28 3909
102 리눅스를 백업 복구 tar admin 2018-03-28 6466
101 zip 압축 파일 및 텍스트 파일의 한글 깨짐 해결 방법 admin 2018-03-28 6778
100 Lnux export how to admin 2017-12-17 5447
99 What's the difference between “adduser” and “useradd”? admin 2017-12-15 5315
98 useradd Command 리눅스 admin 2017-12-15 13696
97 How To Install Java with Apt-Get on Ubuntu 16.04 oracle java admin 2017-10-13 6475
96 우분투 Linux(Ubuntu)에 Java설치 및 환경 설정하는 방법 admin 2017-10-13 7281
95 우분투 다운로드 사이트 주소 ubuntu download 16.04.3 17.04 site link admin 2017-10-13 7419
94 How to install Java on linux with no Internet connectivity (using local repository) admin 2017-10-01 6457
93 윈도우 ssh 접속 프로그램 admin 2017-09-29 7757
92 openvpn Easy Windows Guide admin 2017-09-20 23889
91 OpenVPN - Getting started How-To admin 2017-09-20 16444
90 openssl 을 이용한 인증서 생성 절차를 정리한다. 개인키 CSR SSL 인증서 파일 생성 admin 2017-09-14 8506
89 How to Manually Unblock / Unban IP Address in fail2ban 차단풀기 admin 2017-09-12 15039
88 How To Protect SSH with fail2ban on Debian 7 데비안 ssh 방어 무작위 로그인 admin 2017-09-12 24758
87 SSH 무작위 로그인 시도 막기(With Fail2Ban on CentOS 6/7 + selinux) admin 2017-09-12 7900
86 리눅스 데비안 네트워크 설정 유선랜 무선랜 linux debian network setting 설정 admin 2017-09-07 27584
85 linux debian 계열 network 설정 테트워크 데비안 admin 2017-09-07 6984
84 PUTTY DOWNLOAD - FREE SSH & TELNET CLIENT admin 2017-09-03 25012
83 debian 8.8 download cd1 cd2 cd3 etc admin 2017-09-03 6870
82 Debian Download 데비안 리눅스 다운로드 admin 2017-09-02 7781
81 데비안 리눅스 부팅시에 방화벽 서버에 자동실행 되게 설정 해보자 admin 2017-08-30 7236
80 리눅스 시작시에 부팅시 프로세스 프로그램 자동 실행 설정 admin 2017-08-30 27143
79 리눅스 시작시 부팅 시, 프로그램 자동실행 등록하기 admin 2017-08-30 13602
78 리눅스 부팅시 시작시 프로그램 명령어 실행하기 (Linux Init script) admin 2017-08-30 17144
77 리눅스 부팅시 자동 실행 명령스크립트 실행하기 만들기 이해 linux booting admin 2017-08-30 31860
76 부팅시 자동실행 명령어 스크립트, rc.local admin 2017-08-30 32253
75 the world’s most widely deployed RADIUS server document admin 2017-08-29 23976
74 네트워크 디바이스명 변경 리눅스 eth0 eth1 admin 2017-08-29 26080
73 Cloned VMware CentOS6 Server "device eth0 does not seem to be present, admin 2017-08-29 6993
72 VMWARE VM Error boot loader install grub - install /dev/sda or /dev/hda MBR linux admin 2016-01-27 8017
71 Linux and Unix touch command admin 2015-11-15 8258
70 Configuration of Red Hat 5.4 Xen for SR-IOV Support admin 2015-08-02 8339
69 apt-get install linux-image-2.6.26-2-686-bigmem admin 2015-06-27 8073
68 intel i210 driver install and compile debian admin 2015-06-27 20992
67 Debian / Ubuntu Linux Install Kernel Headers Package admin 2015-06-27 8101
66 mount -t auto /dev/sdb1 /mnt && ls /mnt admin 2015-06-27 8025
65 kali linux 해킹 hacking attack DDOS etc tools admin 2015-06-24 10014
64 sources.list lenny admin 2015-02-03 9490
63 Ubuntu 14.04 원격 접속(xrdp) 설정 admin 2014-12-21 53103
62 Remote Desktop Connection from Windows 7/8 to Ubuntu 14.04 admin 2014-12-21 10276
61 Using Windows RDP to Access your Ubuntu Instance admin 2014-12-21 10090
60 Install GUI on Ubuntu Server admin 2014-12-21 10086
59 How to start GUI from command line? admin 2014-12-21 10729
58 Download all files in a directory using WGET admin 2014-12-16 9800
57 문서 편집기 vi vim command 명령어 정리 admin 2014-10-29 14246
56 find 명령 사용 예제들 admin 2014-10-29 11474
55 특정 IP 엑세스 못하게 하는방법 admin 2014-10-29 12601
54 scp 명령어를 이용한 파일 복사 및 전송 admin 2014-10-29 14845
53 [리눅스] 소프트웨어 레이드의 리빌딩 및 리싱킹 속도를 높이는 5가지 방법 admin 2014-10-17 11578
52 /bin/false, /sbin/nologin 의 차이점 admin 2014-10-13 14558
51 리눅스 시스템 유저 추가 명령어 useradd 사용하기 admin 2014-08-09 12411
50 리눅스 시스템 시작시에 자동 실행할 파일 등록하기 admin 2014-03-22 76771
49 linux 에티터 명령어 정리 포그라운드 전환 : ctrl + z 다시 vi 모드로 돌아오려면 fg admin 2014-03-05 34896
48 Linux Memory Management – Virtual Memory and Demand Paging admin 2014-03-03 14954
47 iptables rules tcp drop all port except tcp 22 admin 2014-02-26 16181
46 seagate HD 시게이트 하드 디스크 A/S 에이에스 기간 조회 및 받는 3가지 방법 admin 2013-12-09 18931
45 SSH Without Authentication Using Key Files (CentOS 5.6) admin 2013-11-22 14782
44 Getting started with SSH public key cryptography admin 2013-09-05 37296
43 암호 없이 SSH 접속하기 admin 2013-09-05 17210
42 Linux Date Command Examples to Display and Set System Date Time admin 2013-07-11 19653
41 FreeRADIUS 설치(freeradius-sever-2.1.8) admin 2013-04-19 47494
40 Radius를 이용한 ssh 인증 서버 구축하기 admin 2013-04-19 34261
39 CentOS 5.4에서 RADIUS 서버 설치하기 admin 2013-04-19 48111
38 Event IP 20187 admin 2013-04-08 15520
37 리눅스에서 자바(JDK) 설치하기 admin 2013-04-08 17607
36 리눅스 네트워크 설정 멸령어 Linux admin 2013-04-08 16679
35 [linux]리눅스 버전및 CPU등 환경정보 확인하기 admin 2013-04-08 74792
34 Linux 시스템 백업과 복원 admin 2013-04-04 24840
33 tar로 전체시스템 백업 LINUX Backup admin 2013-04-04 59793
32 다운된 리눅스서버 응급복구 admin 2013-03-28 30488
31 Build a RADIUS server on Linux admin 2013-03-23 29503
30 Deploying FreeRADIUS with the MySQL Cluster Database file admin 2013-03-22 15768
29 FREE RADIUS 활용및 응용 admin 2013-02-23 29721
28 리눅스에 RADIUS 서버 구현하기 admin 2012-09-01 76998
27 Debian CD DVD 다운로드 링크 헤메지말고 바로 다운로드하지요 admin 2012-08-18 16407
26 Site builder shootout: Drupal vs. Joomla vs. WordPress admin 2012-07-15 81566
25 WinXP 부팅안되는 현상 NTLDR is missing 메세지 admin 2012-07-12 18549
24 윈도우XP 알면 정말 편한 숨겨진 기능 60가지 admin 2012-05-11 28261
23 한국인/국내기업은 얼마나 Linux Kernel에 기여할까? admin 2012-04-29 26237
22 scp, ssh, rsync등을 사용할때에 SSH 비밀번호 묻는것 피하기 admin 2012-04-15 19663
21 [Linux/SSL] 리눅스 서버에 Apache 2 설치 및 SSL 설정하기(mod_ssl, openssl) admin 2012-04-15 20547
20 리눅스의 막강한 네트워크 필터 iptables admin 2012-04-15 17557
19 Centos net install web http admin 2012-03-02 28393
18 Linux 시스템 백업과 복원 admin 2012-02-28 27079