파일 기술자

File descriptor

Unix 및 Unix와 유사한 컴퓨터 운영 체제에서 파일 기술자(FD, fildes)는 파일 또는 파이프네트워크 소켓과 같은 다른 입출력 리소스의 고유한 식별자(핸들)입니다.

파일 기술자에는 일반적으로 음수가 아닌 정수 값이 있으며 음수 값은 "값 없음" 또는 오류 조건을 나타내기 위해 예약되어 있습니다.

파일 기술자는 POSIX API의 일부입니다.Unix 프로세스(대몬 제외)에는 3개의 표준 스트림에 대응하는3개의 표준 POSIX 파일 기술자가 필요합니다.

정수값 이름. <리스트 없음.h> 심볼[1] 상수 <stdio.h> 파일[2] 스트림
0 표준 입력 STDIN_FILENO 스틴
1 표준 출력 STDOUT_FILENO 설치하다
2 표준오차 STDERR_FILENO 하드

개요

단일 프로세스, 파일 테이블 및 inode 테이블의 파일 기술자.노트는 다중 파일 설명자의 같은 파일 테이블 엔트리(그dup 시스템 call[3]의 결과로 예::104)에 가서는 다중 파일 테이블 항목에 같은 inode을 가르키느냐 추천할 수 있는(만약 그것이 여러번, 심지어는 inode multipl 수 있기 때문에, 파일 이름에 의해 inodes을 나타내는 탁자는 아직도 간이다.e이름). 파일 디스크립터 3은 파일테이블 내의 어떤 것도 참조하지 않고 닫혀 있음을 나타냅니다.

Unix의 기존 구현에서 파일 기술자는 커널에 의해 유지되는 프로세스별 파일 기술자 테이블로 인덱스를 작성하고, 파일 테이블이라고 불리는 모든 프로세스에 의해 열린 파일 시스템 전체의 테이블로 인덱스를 변환합니다.이 표에는 파일(또는 다른 리소스)이 열린 모드(읽기, 쓰기, 추가 및 기타 모드)가 기록됩니다.또한 실제 기본 [3]파일을 설명하는 inode 테이블이라는 세 번째 테이블로 인덱싱합니다.입력 또는 출력을 수행하기 위해 프로세스는 시스템 호출을 통해 파일 기술자를 커널에 전달하고 커널은 프로세스 대신 파일에 액세스합니다.프로세스에서는 파일 또는 inode 테이블에 직접 액세스할 수 없습니다.

Linux에서는 프로세스에서 열려 있는 파일 기술자 집합에 경로에서 액세스할 수 있습니다./proc/PID/fd/여기서 PID는 프로세스 식별자입니다.파일 기술자/proc/PID/fd/0stdin,/proc/PID/fd/1stdout,그리고./proc/PID/fd/2stderr실행 중인 모든 프로세스가 폴더를 통해 파일 기술자에 액세스할 수도 있습니다./proc/self/fd그리고./dev/fd를 클릭합니다.[4]

Unix 계열 시스템에서는 파일 기술자가 파일시스템에 있는 임의의 Unix 파일유형을 참조할 수 있습니다.여기에는 일반 파일뿐만 아니라 디렉터리, 블록문자 장치("특수 파일"이라고도 함), UNIX 도메인 소켓 및 명명된 파이프가 포함됩니다.파일 기술자는 익명 파이프네트워크 소켓과 같이 파일 시스템에 일반적으로 존재하지 않는 다른 개체를 참조할 수도 있습니다.

C 표준 I/O 라이브러리의 FILE 데이터 구조에는 보통 Unix 계열 시스템에서 문제가 되는 개체의 하위 수준의 파일 기술자가 포함됩니다.전체적인 데이터 구조는 추가적인 추상화를 제공하며 대신 파일 핸들이라고 합니다.

파일 기술자에 대한 작업

다음은 최신 Unix 유사 시스템의 파일 기술자에 대한 일반적인 작업을 보여 줍니다.이러한 함수의 대부분은 에 선언되어 있습니다.<unistd.h>헤더에 있는 것도 있지만,<fcntl.h>header를 입력합니다.

파일 설명자를 만드는 중

  • 오픈()
  • create()[5]
  • 소켓()
  • 승낙()
  • 소켓페어()
  • 파이프()
  • epoll_create() (Linux)
  • signalfd() (Linux)
  • eventfd() (Linux)
  • timerfd_create() (Linux)
  • memfd_create() (Linux)
  • userfaultfd() (Linux)
  • fanotify_init() (Linux)
  • inotify_init() (Linux)
  • clone() (CLONE_PIDFD, Linux 플래그 포함)
  • pidfd_open() (Linux)
  • open_by_handle_at() (Linux)

파일 기술자 파생

  • dirfd()
  • 파일()

단일 파일 설명자에 대한 작업

  • readvisor write()
  • readvswritev()
  • pwrite() 프리애드
  • recvarious send()
  • recvfrom sendto()
  • recvmsg()sendmsg() (유닉스 도메인소켓 경유로 FD를 다른 프로세스에 송신하는 경우에도 사용)
  • recvmmsg sendmmsg()
  • lseek(lseek) lseek
  • fstat()
  • fstatvfs()
  • fchmod()
  • fchown()
  • ftruncate()
  • fsync()
  • fdatasync()
  • fdopendir()
  • fgetxattr() , fsetxattr() (Linux)
  • flistxattr() , fremovexattr() (Linux)
  • statx(Linux)
  • setns(Linux)
  • vmsplice() (Linux)
  • pidfd_send_signal() (Linux)
  • waitid() (P_PIDFD ID 타입, Linux)
  • fdopen() (stdio 함수: 파일 기술자를 FILE*로 변환)
  • dprintf() (stdio 함수: 파일 기술자로 인쇄)

여러 파일 기술자에 대한 작업

  • select pselect()를 선택합니다.
  • 폴링 poll()
  • epoll_wait(), epoll_pwait(), epoll_pwait2() (Linux에서는 다른 많은 파일 기술자를 대기시키려면 단일 epoll 파일 기술자가 필요합니다.)
  • epoll_ctl() (Linux의 경우)
  • kqueue() (BSD 기반 시스템의 경우).
  • sendfile()
  • splice(), tee()(Linux의 경우)
  • copy_file_range()(Linux의 경우)
  • close_range() (Linux의 [6]경우)

파일 설명자 테이블에서의 작업

fcntl() 함수는 파일 기술자에 전달되는 명령어 인수에 따라 파일 기술자에 대해 다양한 작업을 수행하기 위해 사용됩니다.F_GETFD, F_SETFD, F_GETFLF_SETFL 등의 파일 기술자와 관련된 속성을 가져오고 설정하는 명령어가 있습니다.

  • 닫다()
  • closefrom() (BSD 및 Solaris 한정.지정된 수 이상의 모든 파일 기술자를 삭제합니다)
  • dup() (기존 파일 기술자가 사용 가능한 최소 파일 기술자임을 보증함)
  • dup2() , dup3() (필요에 따라 fd1을 닫고 파일 기술자 fd1이 fd2의 열린 파일을 가리키도록 합니다.)
  • fcntl (F_DUPFD)

프로세스 상태를 수정하는 작업

  • fchdir() (디렉토리 파일 기술자에 따라 프로세스의 현재 작업 디렉토리를 설정합니다.)
  • mmap() (프로세스의 주소 공간에 파일 범위를 포함)

파일 잠금

  • 플럭()
  • fcntl() (F_GETLK, F_SETLKF_SETLKW)
  • lockf()

소켓

  • 접속()
  • 바인드()
  • 리슨()
  • accept() (착신 접속의 새로운 파일 기술자 추가)
  • getsockname()
  • getpeername()
  • getsockopt()
  • setsockopt()
  • shutdown() (전이중 접속의 한쪽 또는 양쪽을 정지)

여러가지 종류의

  • ioctl() (단일 파일 기술자 상의 기타 조작의 대규모 집합.대부분 디바이스와 관련되어 있습니다)

향후의 운용

파일 기술자에 대한 일련의 새로운 작업이 많은 현대 Unix 계열 시스템과 수많은 C 라이브러리에 추가되어 POSIX[7]미래 버전에서 표준화되었습니다.atsuffix는 함수가 파일 기술자를 제공하는 추가 첫 번째 인수를 사용한다는 것을 나타냅니다.파일 기술자에는 상대 경로가 해결됩니다.형식은 다음과 같습니다.at따라서 현재 작업 디렉토리에 대응하는 파일 기술자를 전달하는 것과 같아집니다.이러한 새로운 조작의 목적은 특정 클래스의 TOCTOU 공격으로부터 방어하는 것입니다.

  • openat()
  • paccessat()
  • fchmodat()
  • fchownat()
  • fstat()
  • 미래()
  • linkat()
  • mkdirat()
  • mknodat()
  • readlinkat()
  • renameat()
  • symlinkat()
  • 링크 해제()
  • mkfifoat()
  • fdopendir()

기능으로서의 파일 기술자

UNIX 파일 기술자는 여러 가지 기능으로 작동합니다.이러한 패킷은 Unix 도메인 소켓을 통해 프로세스 간에 전달될 수 있습니다.sendmsg()시스템 콜을 실행합니다.그러나 실제로 전달되는 것은 변경 가능한 상태(파일 오프셋, 파일 상태 및 액세스 플래그)를 가진 "열린 파일 설명"에 대한 참조입니다.이는 파일 설명자를 기능으로 안전하게 사용하는 것을 복잡하게 만듭니다. 예를 [8][9]들어 프로그램이 동일한 열린 파일 설명에 대한 액세스를 공유할 때 오프셋을 변경하거나 차단 또는 비차단 여부를 변경하여 서로 파일 설명자의 사용을 방해할 수 있기 때문입니다.기능 시스템으로 특별히 설계된 운영 체제에서는 기능 자체와 관련된 변경 가능한 상태가 거의 없습니다.

Unix 프로세스의 파일 기술자 테이블은 C 목록의 예입니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ The Open Group. "The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008, 2016 Edition". Retrieved 2017-09-21.
  2. ^ The Open Group. "The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008, 2016 Edition". <stdio.h>. Retrieved 2017-09-21.
  3. ^ a b Bach, Maurice J. (1986). The Design of the UNIX Operating System (8 ed.). Prentice-Hall. pp. 92–96. ISBN 9780132017992.
  4. ^ "Devices - What does the output of 'll /Proc/Self/Fd/' (From 'll /Dev/Fd') mean?".
  5. ^ The Open Group. "The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008, 2018 Edition – creat". Retrieved 2019-04-11.
  6. ^ Stephen Kitt, Michael Kerrisk. "close_range(2) — Linux manual page". Retrieved 2021-03-22.
  7. ^ Extended API Set, Part 2. The Open Group. October 2006. ISBN 1931624674.
  8. ^ Brinkmann, Marcus (2009-02-04). "Building a bridge: library API's and file descriptors?". cap-talk. Archived from the original on 2012-07-30. Retrieved 2017-09-21.
  9. ^ de Boyne Pollard, Jonathan (2007). "Don't set shared file descriptors to non-blocking I/O mode". Retrieved 2017-09-21.