File descriptor (fd)
Um file descriptor (FD) é um inteiro não negativo usado pelo SO para identificar um ficheiro aberto por um processo. Quando um programa abre um ficheiro, o SO cria uma entidade para aquele ficheiro e retorna um número que o representa. Esse número é designado por file descriptor (fd). O programa usa então esse descriptor para efectuar operações como:
Ler dados do ficheiro
Escrever dados no ficheiro
Fechar o ficheiro
Mudar a posição no ficheiro
Os principais file descriptors reservaos pelo sistema operativo são:
0 → Standard Input (stdin)
1 → Standard Output (stdout)
2 → Standard Error (stderr)
Por exemplo quando usamos o comando ls, vamos ler ao stdin (fd = 0) o que o utilizador escreve no teclado, o output é escrito no stdout (fd = 1) e os erros são escritos no stderr (fd = 3).
$ ls -l
Neste caso especial abaixo mostrado, estamos a redireccionar o stdout (fd=1) para o ficheiro “output.txt”.
$ ls -l > output.txt
Quando um processo abre um ficheiro do sistema operativo (em Linux/Unix), existem duas tabelas diferentes de importância:
Tabela de File Descriptors (FD table): pertence ao processo
Tabela de Open File Table (ficheiros abertos): pertence ao sistema operativo (kernel)
Vários FDs até do mesmo processo podem apontar para a mesma entrada aberta. O mesmo processo pode abrir um ficheiro para escrita e o mesmo ficheiro para leitura. Ambos apontam para a mesma entrada da open file table mas correspondem a fds diferentes. O SO mantêm estas duas tabelas para puder separar duas visões: a visão do processo (FDs) e o estado real do ficheiro.