descritor de arquivo vs. nome do arquivo

10

Eu queria saber quais são as diferenças e relações entre descritores de arquivos e nomes de arquivos. Eles são todos usados para acessar arquivos? Se sim, da mesma forma?

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

    
por Tim 07.08.2011 / 19:11

2 respostas

10

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.

    
por 07.08.2011 / 20:02
2

Nome do arquivo é apenas um nome do arquivo no sistema de arquivos, nada mais - é apenas uma string.

Descritor de arquivo é um tipo de objeto, de onde você pode ler e / ou escrever. Isso é aberto e pronto arquivo. Não existem apenas descritores de arquivos - stdin, stdout e stderr também são descritores, você pode escrever e ler a partir deles usando absolutamente 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, descritor de arquivo é uma variável, ponteiro para algo no kernel, que representa o objeto de arquivo.

For example, /dev/fd/0, /dev/stdin, /proc/self/fd/0 are all links to /dev/pts/2. Are these four file descriptors, or file names?

Todos esses são pseudo-arquivos, que podem ser úteis para alguns scripts ou programas. Você pode abri-los e open () retornaria um descritor de arquivos.

    
por 07.08.2011 / 19:48