Todos os quatro /dev/fd/0
, /dev/stdin
, /proc/self/fd/0
e /dev/pts/2
são nomes de arquivos, assim como /////dev/../dev/fd//0
, /bin/sh
, /etc/fstab
, /fioejfoeijf
, etc. Todos, mas esse último exemplo é provável que seja o nome de um arquivo existente em sua máquina. Um nome de arquivo é uma string que pode designar um arquivo no seu sistema de arquivos; no Linux, qualquer sequência que não contenha um byte nulo e que tenha no máximo 4096 bytes de comprimento é um nome de arquivo válido. Muitos desses nomes são equivalentes, por exemplo, /bin/sh
é equivalente a ///bin/sh
, /bin/../bin/sh
(assumindo que /bin
é um diretório existente), etc. Todos os exemplos que eu dei até agora são nomes de arquivo absolutos; também existem nomes de arquivos relativos, que não começam com ae /
cujo significado depende do diretório atual.
A terminologia que envolve os nomes dos arquivos não é universal; às vezes “nome do arquivo” significa um caminho completo para um arquivo e, outras vezes, o nome de uma entrada de diretório. A terminologia POSIX é " nome do arquivo " ou " componente do nome do caminho " para o nome de uma entrada de diretório e " nome do caminho " para um caminho completo.
Um descritor de arquivo designa um arquivo aberto em um processo específico. O kernel mantém uma tabela de descritores de arquivos para cada processo. Cada entrada na tabela de descritores de arquivos indica o que fazer se o processo solicitar leitura, gravação e outras operações no descritor de arquivos.
Os descritores de arquivo podem corresponder a um arquivo e ter um nome associado, mas nem todos. Para aqueles que o fazem, o arquivo pode ser um arquivo regular, um diretório, um arquivo de dispositivo ou um pipe nomeado (também chamado de FIFO) (o tipo criado por mkfifo
); alguns sistemas têm outras possibilidades, como soquetes e portas unix. Exemplos de descritores de arquivo que não possuem um arquivo nomeado associado incluem pipes (do tipo criado pelo pipe
) e soquetes de rede .
/dev/fd/0
, /dev/stdin
e /proc/self/fd/0
são nomes de arquivos (todos equivalentes) com um significado peculiar: todos eles designam qualquer arquivo atualmente acessado via descritor de arquivo 0. Quando um processo os abre, o kernel copia a entrada com o índice 0 na tabela de descritores de arquivos para uma nova descritor. Abrir qualquer um desses arquivos é equivalente a chamar dup(0)
. Os arquivos nomeados são uma maneira de obter indiretamente um processo para usar um de seus arquivos já abertos, em vez de abrir um novo arquivo; eles são principalmente úteis para transmitir a linha de comando de um programa, onde o programa espera que o nome de um arquivo seja aberto.