Qual é o referente de um descritor de arquivo?

4

Meu entendimento é que um descritor de arquivo é um inteiro que é uma chave no mapeamento por kernel do processo para objetos como open() ed files, pipes, sockets, etc.

Existe um nome próprio, curto e específico para "arquivos abertos / sockets / pipes / ...", os referentes dos descritores de arquivos?

Chamá-los de "arquivos" gera confusão com arquivos não abertos armazenados no sistema de arquivos. Simplesmente referindo-se a descritores de arquivo não descreve adequadamente a semântica (por exemplo, copiar o inteiro entre processos é inútil).

Consultoria As Especificações Básicas do Open Group e as páginas do meu próprio sistema me levam à conclusão de que o referente de um arquivo descritor é um objeto e quando é especificamente um arquivo aberto é, bem, um arquivo aberto . Existe um termo mais específico do que objeto ?

    
por Kevin Reid 15.04.2011 / 13:52

2 respostas

8

Não há realmente um termo mais específico. No Unix tradicional, os descritores de arquivos referenciam entradas na tabela de arquivos , entradas das quais são referidas como arquivos , ou às vezes arquivos abertos . Isso está em um contexto específico, então, embora obviamente o termo arquivo seja bastante genérico, no contexto da tabela de arquivos ele se refere especificamente a arquivos abertos.

Os arquivos no disco são geralmente chamados de inodes , embora tecnicamente o inode seja a parte de metadados do arquivo. No entanto, como o relacionamento entre o inode e os blocos de dados é um-para-um, referir-se a um inode refere-se implicitamente aos dados para os quais ele aponta. Sistemas de arquivos mais modernos podem suportar recursos como copy-on-write, onde blocos de dados podem ser compartilhados, então isso não é universalmente verdadeiro, mas é para o Unix tradicional. No entanto, dado o termo sistema de arquivos , não é um pequeno salto considerar o conteúdo disso como arquivos .

inodes também são lidos na memória como inodes do núcleo quando um arquivo no disco é aberto e mantido na tabela de inodes , mas esse é um nível de indireção mais do que você está perguntando.

Isso leva ao conflito na terminologia: arquivos no disco (referenciados por um inode) e arquivos abertos (referenciados por entradas na tabela de arquivos).

Eu sugeriria que "arquivo aberto" ou "entrada da tabela de arquivos" são descrições adequadas do que você deseja descrever.

Uma referência razoavelmente concisa que encontrei está em: link . Referências do formulário (Bach nn ) são referências ao livro O Design do Sistema Operacional Unix por Maurice J. Bach.

    
por 15.04.2011 / 14:17
1

No 7th Edition Unix, o descritor de arquivo é um índice para uma tabela na estrutura do usuário que é simplesmente uma matriz de ponteiros na tabela de arquivos abertos [global do sistema]. Portanto, o próprio descritor de arquivo é realmente uma referência indireta , um 'ponteiro para um ponteiro' de tipos. Ele também indexa uma matriz de campos de sinalizador de um byte (que incluía apenas, no momento, pelo menos, o sinalizador close-on-exec).

struct user {
    ...
    struct file *u_ofile[NOFILE]; /* pointers to file structures of open files */
    char u_pofile[NOFILE]; /* per-process flags of open files */
}

A própria tabela de arquivos abertos contém o modo de leitura / gravação no qual um arquivo foi aberto, um ponteiro para o inode, a posição e provavelmente dezenas de outras coisas em sistemas modernos. Não tenho idéia se a tabela do descritor de arquivos contém algo mais do que isso em sistemas modernos.

Veja:

por 15.04.2011 / 23:20