descritor de arquivo x nome do arquivo

12

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/stdine /proc/self/fd/0são todos os links para /dev/pts/2. São esses quatro descritores de arquivos ou nomes de arquivos?

Tim
fonte
stackoverflow.com/questions/33495283/…
Ciro Santilli deve ser executado em

Respostas:

12

Todos os quatro /dev/fd/0, /dev/stdin, /proc/self/fd/0e /dev/pts/2sã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/stdine /proc/self/fd/0sã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.

Gilles 'SO- parar de ser mau'
fonte
@Giles Você escreveu "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." ( Grifo meu). Tanto quanto eu entendi, é apenas um número inteiro como o padrão 0,1,2 etc para stdin, stdout e stderr, respectivamente. Seriam números com valores mais altos para arquivos regulares. O que não recebo do seu comentário é como esse número indica "o que fazer se o processo solicitar leitura, gravação e outras operações no descritor de arquivo". . Você pode expandir um pouco isso?
27714 Geek
@ Geek Uma entrada na tabela de descritores de arquivos não é um número. O número é o índice nessa tabela.
Gilles 'SO- stop be evil'
@Giles obrigado pelo esclarecimento do meu mal-entendido. Eu entendo melhor agora. Então, você pode dar um exemplo da parte "o que fazer" em sua resposta. Concluí que cada entrada na tabela de descritores de arquivos tem um ponteiro para uma tabela de arquivos que contém informações como deslocamento de arquivo, status do arquivo etc. Mas ainda não estou claro quanto à parte "o que fazer" em sua resposta.
28414 Geek
2

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.

Por exemplo, / dev / fd / 0, / dev / stdin, / proc / self / fd / 0 são todos os links para / dev / pts / 2. São esses quatro descritores de arquivos ou nomes de arquivos?

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.

rvs
fonte