Un descriptor de archivos (file descriptor) es un número entero positivo que utiliza un proceso para identificar un archivo abierto dentro del sistema. Para saber el número máximo de descriptores de archivos que puede haber en un sistema de archivos se utiliza la macro OPEN_MAX. Esta macro forma parte de la biblioteca <limits.h> y nos indica el número máximo de archivos que pueden estar abiertos de forma simultánea en el sistema.
Cuando un programa quiere acceder a un archivo abierto, el kernel le devuelve un descriptor de archivos. Este fd apunta a una entrada específica dentro de la tabla de archivos del kernel. Esta tabla contiene información sobre el archivo al que hace referencia el descriptor de archivos. Entre esta información se especifican las propiedades read-only, write-only, read-write, etc.
Tres de los descriptores de archivos más importantes y con los que más se trabaja son:
- Standard Input (fd = 0): los datos se mandan por la entrada estándar. Por defecto, son los datos que se envían cuando escribimos por teclado.
- Standard Output (fd = 1): los datos se mandan por la salida estándar. Por defecto, son los datos que se muestran por la pantalla.
- Standard Error (fd = 2): los datos se mandan por la salida de error. Por defecto, son los datos que se mandan por la pantalla para indicar que un programa ha fallado.

Aunque stdout y stderr muestran sus datos por pantalla, estos no son el mismo descriptor de archivos. Digamos que ambos descriptores están conectados a la pantalla del usuario. Así, todos los datos que contengan ambos será mostrados por la pantalla.
Para seguir aprendiendo…
ComputerHope (inglés): File Descriptor
Reloco: File descriptors en Linux
ProgrammerChick: Descriptores de archivos y sistemas de archivos de Linux