table. Note that multiple file descriptors can refer to the same file table entry (e.g., as a result of the
dup system call) and that multiple file table entries can in turn refer to the same inode (if it has been opened multiple times; the table is still simplified because it represents inodes by file names, even though an inode can have
multiple names). File descriptor 3 does not refer to anything in the file table, signifying that it has been closed. In the traditional implementation of Unix, file descriptors index into a per-process '
maintained by the kernel, that in turn indexes into a system-wide table of files opened by all processes, called the '. 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. 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. 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==