File descriptor
Template:Short description Script error: No such module "Unsubst". In Unix and Unix-like computer operating systems, a file descriptor (FD, less frequently fildes) is a process-unique identifier (handle) for a file or other input/output resource, such as a pipe or network socket.
File descriptors typically have non-negative integer values, with negative values being reserved to indicate "no value" or error conditions.
File descriptors are a part of the POSIX API. Each Unix process (except perhaps daemons) should have three standard POSIX file descriptors, corresponding to the three standard streams:
| Integer value | Name | Page Template:Mono/styles.css has no content.<unistd.h> symbolic constant[1] | Page Template:Mono/styles.css has no content.<stdio.h> file stream[2] |
|---|---|---|---|
| 0 | Standard input | Page Template:Mono/styles.css has no content.STDIN_FILENO | Page Template:Mono/styles.css has no content.stdin |
| 1 | Standard output | Page Template:Mono/styles.css has no content.STDOUT_FILENO | Page Template:Mono/styles.css has no content.stdout |
| 2 | Standard error | Page Template:Mono/styles.css has no content.STDERR_FILENO | Page Template:Mono/styles.css has no content.stderr |
Overview
In the traditional implementation of Unix, file descriptors index into a per-process Page Template:Visible anchor/styles.css has no content.file descriptor table maintained by the kernel, that in turn indexes into a system-wide table of files opened by all processes, called the Page Template:Visible anchor/styles.css has no content.file table. This table records the mode with which the file (or other resource) has been opened: for reading, writing, appending, and possibly other modes. It also indexes into a third table called the inode table that describes the actual underlying files.[3] To perform input or output, the process passes the file descriptor to the kernel through a system call, and the kernel will access the file on behalf of the process. The process does not have direct access to the file or inode tables.
On Linux, the set of file descriptors open in a process can be accessed under the path /proc/PID/fd/, where PID is the process identifier. File descriptor /proc/PID/fd/0 is stdin, /proc/PID/fd/1 is stdout, and /proc/PID/fd/2 is stderr. As a shortcut to these, any running process can also access its own file descriptors through the folders /proc/self/fd and /dev/fd.[4]
In Unix-like systems, file descriptors can refer to any Unix file type named in a file system. As well as regular files, this includes directories, block and character devices (also called "special files"), Unix domain sockets, and named pipes. File descriptors can also refer to other objects that do not normally exist in the file system, such as anonymous pipes and network sockets.
The FILE data structure in the C standard I/O library usually includes a low level file descriptor for the object in question on Unix-like systems. The overall data structure provides additional abstraction and is instead known as a file handle.
Operations on file descriptors
The following lists typical operations on file descriptors on modern Unix-like systems. Most of these functions are declared in the <unistd.h> header, but some are in the <fcntl.h> header instead.
Creating file descriptors
- Page Template:Mono/styles.css has no content.open()
- Page Template:Mono/styles.css has no content.creat()[5]
- Page Template:Mono/styles.css has no content.socket()
- Page Template:Mono/styles.css has no content.accept()
- Page Template:Mono/styles.css has no content.socketpair()
- Page Template:Mono/styles.css has no content.pipe()
- Page Template:Mono/styles.css has no content.epoll_create() (Linux)
- Page Template:Mono/styles.css has no content.signalfd() (Linux)
- Page Template:Mono/styles.css has no content.eventfd() (Linux)
- Page Template:Mono/styles.css has no content.timerfd_create() (Linux)
- Page Template:Mono/styles.css has no content.memfd_create() (Linux)
- Page Template:Mono/styles.css has no content.userfaultfd() (Linux)
- Page Template:Mono/styles.css has no content.fanotify_init() (Linux)
- Page Template:Mono/styles.css has no content.inotify_init() (Linux)
- Page Template:Mono/styles.css has no content.clone() (with flag CLONE_PIDFD, Linux)
- Page Template:Mono/styles.css has no content.pidfd_open() (Linux)
- Page Template:Mono/styles.css has no content.open_by_handle_at() (Linux)
- Page Template:Mono/styles.css has no content.kqueue() (BSD)
- Page Template:Mono/styles.css has no content.pdfork() (kFreeBSD)
Deriving file descriptors
- Page Template:Mono/styles.css has no content.dirfd()
- Page Template:Mono/styles.css has no content.fileno()
Operations on a single file descriptor
- Page Template:Mono/styles.css has no content.read(), write()
- Page Template:Mono/styles.css has no content.readv(), Page Template:Mono/styles.css has no content.writev()
- Page Template:Mono/styles.css has no content.pread(), Page Template:Mono/styles.css has no content.pwrite()
- Page Template:Mono/styles.css has no content.recv(), Page Template:Mono/styles.css has no content.send()
- Page Template:Mono/styles.css has no content.recvfrom(), Page Template:Mono/styles.css has no content.sendto()
- Page Template:Mono/styles.css has no content.recvmsg(), Page Template:Mono/styles.css has no content.sendmsg() (also used for sending FDs to other processes over a Unix domain socket)
- Page Template:Mono/styles.css has no content.recvmmsg(), Page Template:Mono/styles.css has no content.sendmmsg()
- Page Template:Mono/styles.css has no content.lseek(), Page Template:Mono/styles.css has no content.llseek()
- Page Template:Mono/styles.css has no content.fstat()
- Page Template:Mono/styles.css has no content.fstatvfs()
- Page Template:Mono/styles.css has no content.fchmod()
- Page Template:Mono/styles.css has no content.fchown()
- Page Template:Mono/styles.css has no content.ftruncate()
- Page Template:Mono/styles.css has no content.fsync()
- Page Template:Mono/styles.css has no content.fdatasync()
- Page Template:Mono/styles.css has no content.fdopendir()
- Page Template:Mono/styles.css has no content.fgetxattr(), Page Template:Mono/styles.css has no content.fsetxattr() (Linux)
- Page Template:Mono/styles.css has no content.flistxattr(), Page Template:Mono/styles.css has no content.fremovexattr() (Linux)
- Page Template:Mono/styles.css has no content.statx (Linux)
- Page Template:Mono/styles.css has no content.setns (Linux)
- Page Template:Mono/styles.css has no content.vmsplice() (Linux)
- Page Template:Mono/styles.css has no content.pidfd_send_signal() (Linux)
- Page Template:Mono/styles.css has no content.pdkill() (kFreeBSD)
- Page Template:Mono/styles.css has no content.waitid() (with P_PIDFD ID type, Linux)
- Page Template:Mono/styles.css has no content.fdopen() (stdio function:converts file descriptor to FILE*)
- Page Template:Mono/styles.css has no content.dprintf() (stdio function: prints to file descriptor)
Operations on multiple file descriptors
- Page Template:Mono/styles.css has no content.select(), Page Template:Mono/styles.css has no content.pselect()
- Page Template:Mono/styles.css has no content.poll(), Page Template:Mono/styles.css has no content.ppoll()
- Page Template:Mono/styles.css has no content.epoll_wait(), Page Template:Mono/styles.css has no content.epoll_pwait(), Page Template:Mono/styles.css has no content.epoll_pwait2() (Linux, takes a single epoll filedescriptor to wait on many other file descriptors)
- Page Template:Mono/styles.css has no content.epoll_ctl() (for Linux)
- Page Template:Mono/styles.css has no content.kqueue() (for BSD-based systems).
- Page Template:Mono/styles.css has no content.sendfile()
- Page Template:Mono/styles.css has no content.splice(), Page Template:Mono/styles.css has no content.tee() (for Linux)
- Page Template:Mono/styles.css has no content.copy_file_range() (for Linux)
Operations on the file descriptor table
The Page Template:Mono/styles.css has no content.fcntl() function is used to perform various operations on a file descriptor, depending on the command argument passed to it. There are commands to get and set attributes associated with a file descriptor, including Page Template:Mono/styles.css has no content.F_GETFD, F_SETFD, F_GETFL and Page Template:Mono/styles.css has no content.F_SETFL.
- Page Template:Mono/styles.css has no content.close()
- Page Template:Mono/styles.css has no content.closefrom() (BSD and Solaris only; deletes all file descriptors greater than or equal to specified number)
- Page Template:Mono/styles.css has no content.close_range() (for Linux)[6]
- Page Template:Mono/styles.css has no content.dup() (duplicates an existing file descriptor guaranteeing to be the lowest number available file descriptor)
- Page Template:Mono/styles.css has no content.dup2(), Page Template:Mono/styles.css has no content.dup3() (Close fd1 if necessary, and make file descriptor fd1 point to the open file of fd2)
- Page Template:Mono/styles.css has no content.fcntl (F_DUPFD)
Operations that modify process state
- Page Template:Mono/styles.css has no content.fchdir() (sets the process's current working directory based on a directory file descriptor)
- Page Template:Mono/styles.css has no content.mmap() (maps ranges of a file into the process's address space)
File locking
- Page Template:Mono/styles.css has no content.flock()
- Page Template:Mono/styles.css has no content.fcntl() (F_GETLK, F_SETLK and Page Template:Mono/styles.css has no content.F_SETLKW)
- Page Template:Mono/styles.css has no content.lockf()
Sockets
Script error: No such module "Labelled list hatnote".
- Page Template:Mono/styles.css has no content.connect()
- Page Template:Mono/styles.css has no content.bind()
- Page Template:Mono/styles.css has no content.listen()
- Page Template:Mono/styles.css has no content.accept() (creates a new file descriptor for an incoming connection)
- Page Template:Mono/styles.css has no content.getsockname()
- Page Template:Mono/styles.css has no content.getpeername()
- Page Template:Mono/styles.css has no content.getsockopt()
- Page Template:Mono/styles.css has no content.setsockopt()
- Page Template:Mono/styles.css has no content.shutdown() (shuts down one or both halves of a full duplex connection)
Miscellaneous
- Page Template:Mono/styles.css has no content.ioctl() (a large collection of miscellaneous operations on a single file descriptor, often associated with a device)
at suffix operations
A series of new operations has been added to many modern Unix-like systems, as well as numerous C libraries, to be standardized in a future version of POSIX.[7] The at suffix signifies that the function takes an additional first argument supplying a file descriptor from which relative paths are resolved, the forms lacking the at suffix thus becoming equivalent to passing a file descriptor corresponding to the current working directory. The purpose of these new operations is to defend against a certain class of TOCTOU attacks.
- Page Template:Mono/styles.css has no content.openat()
- Page Template:Mono/styles.css has no content.faccessat()
- Page Template:Mono/styles.css has no content.fchmodat()
- Page Template:Mono/styles.css has no content.fchownat()
- Page Template:Mono/styles.css has no content.fstatat()
- Page Template:Mono/styles.css has no content.futimesat()
- Page Template:Mono/styles.css has no content.linkat()
- Page Template:Mono/styles.css has no content.mkdirat()
- Page Template:Mono/styles.css has no content.mknodat()
- Page Template:Mono/styles.css has no content.readlinkat()
- Page Template:Mono/styles.css has no content.renameat()
- Page Template:Mono/styles.css has no content.symlinkat()
- Page Template:Mono/styles.css has no content.unlinkat()
- Page Template:Mono/styles.css has no content.mkfifoat()
- Page Template:Mono/styles.css has no content.fdopendir()
File descriptors as capabilities
Unix file descriptors behave in many ways as capabilities. They can be passed between processes across Unix domain sockets using the sendmsg() system call. Note, however, that what is actually passed is a reference to an "open file description" that has mutable state (the file offset, and the file status and access flags). This complicates the secure use of file descriptors as capabilities, since when programs share access to the same open file description, they can interfere with each other's use of it by changing its offset or whether it is blocking or non-blocking, for example.[8][9] In operating systems that are specifically designed as capability systems, there is very rarely any mutable state associated with a capability itself.
A Unix process' file descriptor table is an example of a C-list.
See also
- fuser (Unix)
- lsof
- File Control Block (FCB) – an alternative scheme in CP/M and early versions of DOS
References
Page Template:Reflist/styles.css has no content.
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
- ↑ a b Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
Script error: No such module "Check for unknown parameters".
Script error: No such module "Navbox". Template:Computer files