Eu queria saber o que as diferenças e as relações são entre descritores de arquivos e nomes de arquivos. Todos eles são usados para acessar arquivos? Se sim, da mesma maneira?
Por exemplo, /dev/fd/0
, /dev/stdin
e /proc/self/fd/0
são todos os links para /dev/pts/2
. São esses quatro descritores de arquivos ou nomes de arquivos?
Respostas:
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 pelopipe
) 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 chamardup(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.fonte
Nome do arquivo é apenas um nome do arquivo no sistema de arquivos, nada mais - é apenas uma string.
O descritor de arquivo é algum tipo de objeto, de onde você pode ler e / ou escrever. Esse é o arquivo aberto e pronto. Não existem apenas descritores de arquivos - stdin, stdout e stderr também são descritores, você pode escrever e ler usando as mesmas funções que os arquivos (exceto que você não pode, por exemplo, procurar). Outros exemplos de descritores que não são arquivos são: pipes nomeados e soquetes de rede.
No código, o descritor de arquivo é uma variável, ponteiro para algo no kernel, que representa o objeto do arquivo.
Todos esses são pseudo-arquivos, que podem ser úteis para alguns scripts ou programas. Você pode abri-los e open () retornará um descritor de arquivo.
fonte