Saturday, September 1, 2007

In computer programming, a file descriptor is an abstract key for accessing a file. The term is generally used in POSIX operating systems. In Microsoft Windows terminology and in the context of the C standard I/O library, "file handle" is preferred, though the latter case is technically a different object (see below).
In POSIX, a file descriptor is an integer, specifically of the C type int. There are 3 standard POSIX file descriptors which presumably every process (save perhaps a daemon) should expect to have:
Generally, a file descriptor is an index for an entry in a kernel-resident data structure containing the details of all open files. In POSIX this data structure is called a file descriptor table, and each process has its own file descriptor table. The user application passes the abstract key to the kernel through a system call, and the kernel will access the file on behalf of the application, based on the key. The application itself cannot read or write the file descriptor table directly.
In Unix-like systems, file descriptors can refer to files, directories, block or character devices (also called "special files"), sockets, FIFOs (also called named pipes), or unnamed pipes.
The FILE * file handle in the C standard I/O library routines is technically a pointer to a data structure managed by those library routines; one of those structures usually includes an actual low level file descriptor for the object in question on Unix-like systems. Since file handle refers to this additional layer, it is not interchangeable with file descriptor.
To further complicate terminology, Microsoft Windows also uses the term file handle to refer to the more low-level construct, akin to POSIX's file descriptors. Microsoft's C libraries also provide compatibility functions which "wrap" these native handles to support the POSIX-like convention of integer file descriptors as detailed above.

Operations on file descriptors

open(), open64(), creat(), creat64()
pipe() Creating file descriptors

dirfd() File handle Deriving file descriptors

read(), write()
recv(), send()
recvmsg(), sendmsg() (inc. allowing sending FDs)
lseek(), lseek64()
fstat(), fstat64()
ftruncate() Operations on a single file descriptor

select(), pselect()
poll() Operations on multiple file descriptors

fcntl (F_DUPFD)
fcntl (F_GETFD and F_SETFD) File handle Operations on the file descriptor table

fchdir(): sets the process's current working directory based on a directory file descriptor
mmap(): maps ranges of a file into the process's address space Operations that modify process state

lockf() File locking

accept(): creates a new file descriptor for an incoming connection
getsockopt(), setsockopt()
shutdown(): shuts down one or both halves of a full duplex connection Upcoming Operations
Unix file descriptors are capabilities. They can be passed between processes across Unix domain sockets using the sendmsg() system call.
A Unix process' file descriptor table is an example of a C-list.

No comments: