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.

Tabela de File Descriptors