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 menos esse último exemplo provavelmente será o nome de um arquivo existente em sua máquina. Um nome de arquivo é uma cadeia que pode designar um arquivo em seu sistema de arquivos; no Linux, qualquer string que não contenha um byte nulo e que tenha no máximo 4096 bytes de comprimento é um nome de arquivo válido. Muitos destes nomes são equivalentes, por ex. /bin/sh
é equivalente a ///bin/sh
, /bin/../bin/sh
(assumindo /bin
é um diretório existente), etc. Todos os exemplos que eu dei até agora são nomes de arquivos absolutos; também há nomes de arquivos relativos, que não começam com /
e cujo significado depende do diretório atual.
A terminologia em torno dos nomes dos arquivos não é universal; às vezes, “nome do arquivo” significa um caminho completo para um arquivo e, às vezes, significa o nome de uma entrada de diretório. A terminologia POSIX é “ nome de arquivo ” ou “ponto de nome do aplicativo ”para o nome de uma entrada de diretório e“ pathname ”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 do descritor de arquivos indica o que fazer se o processo solicitar leitura, gravação e outras operações no descritor de arquivo.
Os descritores de arquivo podem corresponder a um arquivo e ter um nome associado, mas nem todos eles têm. 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 têm um arquivo nomeado associado incluem pipes (o tipo criado pela pipe
) e redes soquetes .
/dev/fd/0
, /dev/stdin
e /proc/self/fd/0
são nomes de arquivos (todos equivalentes) com um significado peculiar: todos eles designam o arquivo atualmente acessado pelo descritor de arquivo 0. Quando um processo abre esses arquivos, o kernel copia a entrada com índice 0 na tabela de descritores do descritor de arquivo para um novo descritor. Abrir qualquer um desses arquivos equivale a chamar dup(0)
. Os arquivos nomeados são uma maneira indireta de obter um processo para usar um de seus arquivos já abertos em vez de abrir um novo arquivo; eles são mais úteis para passar na linha de comando de um programa, onde o programa espera que o nome de um arquivo seja aberto.