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). .. code-block:: bash $ ls -l Neste caso especial abaixo mostrado, estamos a redireccionar o stdout (fd=1) para o ficheiro "output.txt". .. code-block:: bash $ 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. .. image:: /pictures/fds.png :alt: Tabela de File Descriptors :align: center :width: 40%