Descritor de arquivo - File descriptor

Em sistemas operacionais de computador Unix e semelhantes ao Unix , um descritor de arquivo ( FD , com menos freqüência fildes ) é um identificador único ( identificador ) para um arquivo ou outro recurso de entrada / saída , como um canal ou soquete de rede .

Os descritores de arquivo normalmente têm valores inteiros não negativos, com valores negativos sendo reservados para indicar "nenhum valor" ou condições de erro.

Os descritores de arquivo fazem parte da API POSIX . Cada processo Unix (exceto talvez daemons ) deve ter três descritores de arquivo POSIX padrão, correspondendo aos três fluxos padrão :

Valor inteiro Nome < unistd.h > constante simbólica < stdio.h > fluxo de arquivo
0 Entrada padrão STDIN_FILENO Stdin
1 Saída padrão STDOUT_FILENO stdout
2 Erro padrão STDERR_FILENO stderr

Visão geral

Descritores de arquivo para um único processo, tabela de arquivo e tabela de inode . Observe que vários descritores de arquivo podem se referir à mesma entrada da tabela de arquivo (por exemplo, como resultado da chamada do sistema dup e que várias entradas da tabela de arquivo podem, por sua vez, referir-se ao mesmo inode (se tiver sido aberto várias vezes; a tabela é ainda simplificado porque representa inodes por nomes de arquivo, embora um inode possa ter vários nomes .) O descritor de arquivo 3 não se refere a nada na tabela de arquivos, significando que foi fechado.

Na implementação tradicional do Unix, os descritores de arquivo indexam em um processo por tabela de descritor de arquivo mantida pelo kernel, que por sua vez, os índices em uma tabela de arquivos de todo o sistema aberta por todos os processos, chamada detabela de arquivos . Esta tabela registra omodocom o qual o arquivo (ou outro recurso) foi aberto: para leitura, gravação, acréscimo e possivelmente outros modos. Ele também indexa em uma terceira tabela chamadatabela inode,que descreve os arquivos subjacentes reais. Para realizar a entrada ou saída, o processo passa o descritor de arquivo para o kernel por meio de umachamada de sistema, e o kernel acessará o arquivo em nome do processo. O processo não tem acesso direto ao arquivo ou às tabelas de inode.

No Linux , o conjunto de descritores de arquivo abertos em um processo pode ser acessado no caminho /proc/PID/fd/, onde PID é o identificador do processo .

Em sistemas semelhantes ao Unix, os descritores de arquivo podem referir-se a qualquer tipo de arquivo Unix nomeado em um sistema de arquivos. Assim como arquivos regulares, isso inclui diretórios , dispositivos de bloco e caracteres (também chamados de "arquivos especiais"), soquetes de domínio Unix e canais nomeados . Os descritores de arquivo também podem se referir a outros objetos que normalmente não existem no sistema de arquivos, como canais anônimos e soquetes de rede .

A estrutura de dados FILE na biblioteca de E / S padrão C geralmente inclui um descritor de arquivo de baixo nível para o objeto em questão em sistemas do tipo Unix. A estrutura de dados geral fornece abstração adicional e, em vez disso, é conhecida como um identificador de arquivo .

Operações em descritores de arquivo

A seguir está uma lista de operações típicas em descritores de arquivo em sistemas modernos do tipo Unix. A maioria dessas funções é declarada no <unistd.h>cabeçalho, mas algumas estão no <fcntl.h>cabeçalho.

Criação de descritores de arquivo

  • abrir ()
  • creat ()
  • socket ()
  • aceitar()
  • socketpair ()
  • tubo()
  • epoll_create () (Linux)
  • signalfd () (Linux)
  • eventfd () (Linux)
  • timerfd_create () (Linux)
  • memfd_create () (Linux)
  • userfaultfd () (Linux)
  • fanotify_init () (Linux)
  • inotify_init () (Linux)
  • clone () (com sinalizador CLONE_PIDFD, Linux)
  • pidfd_open () (Linux)
  • open_by_handle_at () (Linux)

Derivando descritores de arquivo

  • dirfd ()
  • sem Arquivo()

Operações em um único descritor de arquivo

  • ler (), escrever ()
  • readv () , Writeev ()
  • pread () , pwrite ()
  • recv () , enviar ()
  • recvfrom () , sendto ()
  • recvmsg () , sendmsg () (também usado para enviar FDs para outros processos em um soquete de domínio Unix)
  • recvmmsg () , sendmmsg ()
  • lseek () , llseek ()
  • fstat ()
  • fstatvfs ()
  • fchmod ()
  • fchown ()
  • ftruncate ()
  • fsync ()
  • fdatasync ()
  • fdopendir ()
  • fgetxattr () , fsetxattr () (Linux)
  • flistxattr () , fremovexattr () (Linux)
  • statx (Linux)
  • setns (Linux)
  • vmsplice () (Linux)
  • pidfd_send_signal () (Linux)
  • waitid () (com tipo de ID P_PIDFD, Linux)
  • fdopen () (função stdio: converte o descritor de arquivo em FILE *)
  • dprintf () (função stdio: imprime no descritor de arquivo)

Operações em vários descritores de arquivo

  • select () , pselect ()
  • poll () , ppoll ()
  • epoll_wait () , epoll_pwait () , epoll_pwait2 () (Linux, usa um único filedescriptor epoll para esperar por muitos outros descritores de arquivo)
  • epoll_ctl () (para Linux)
  • kqueue () (para sistemas baseados em BSD).
  • Enviar arquivo()
  • splice () , tee () (para Linux)
  • copy_file_range () (para Linux)
  • close_range () (para Linux)

Operações na tabela do descritor de arquivo

A função fcntl () é usada para realizar várias operações em um descritor de arquivo, dependendo do argumento de comando transmitido a ele. Existem comandos para obter e definir atributos associados a um descritor de arquivo, incluindo F_GETFD, F_SETFD, F_GETFL e F_SETFL .

  • fechar()
  • closefrom () (BSD e Solaris apenas; exclui todos os descritores de arquivo maiores ou iguais ao número especificado)
  • dup () (duplica um descritor de arquivo existente garantindo ser o descritor de arquivo com o menor número disponível)
  • dup2 () , dup3 () (feche fd1 se necessário e faça com que o descritor de arquivo fd1 aponte para o arquivo aberto de fd2)
  • fcntl (F_DUPFD)

Operações que modificam o estado do processo

  • fchdir () (define o diretório de trabalho atual do processo com base em um descritor de arquivo de diretório)
  • mmap () (mapeia intervalos de um arquivo para o espaço de endereço do processo)

Bloqueio de arquivo

  • rebanho()
  • fcntl () (F_GETLK, F_SETLK e F_SETLKW)
  • lockf ()

tomadas

  • conectar()
  • ligar()
  • ouço()
  • aceitar () (cria um novo descritor de arquivo para uma conexão de entrada)
  • getockname ()
  • getpeername ()
  • getockopt ()
  • setsockopt ()
  • shutdown () (desliga uma ou as duas metades de uma conexão full duplex)

Diversos

  • ioctl () (uma grande coleção de operações diversas em um único descritor de arquivo, frequentemente associado a um dispositivo)

Próximas operações

Uma série de novas operações em descritores de arquivo foi adicionada a muitos sistemas modernos do tipo Unix, bem como a numerosas bibliotecas C, a serem padronizadas em uma versão futura do POSIX . O atsufixo significa que a função recebe um primeiro argumento adicional fornecendo um descritor de arquivo a partir do qual os caminhos relativos são resolvidos, os formulários sem o atsufixo tornando-se assim equivalentes a passar um descritor de arquivo correspondente ao diretório de trabalho atual . O objetivo dessas novas operações é defender contra uma determinada classe de ataques TOCTOU .

  • openat ()
  • faccessat ()
  • fchmodat ()
  • fchownat ()
  • fstatat ()
  • futimesat ()
  • linkat ()
  • mkdirat ()
  • mknodat ()
  • readlinkat ()
  • renameat ()
  • symlinkat ()
  • desligar ()
  • mkfifoat ()
  • fdopendir ()

Descritores de arquivo como recursos

Os descritores de arquivo Unix se comportam de várias maneiras como recursos . Eles podem ser passados ​​entre processos em sockets de domínio Unix usando a sendmsg()chamada de sistema. Observe, entretanto, que o que é realmente passado é uma referência a uma "descrição de arquivo aberto" que possui um estado mutável (o deslocamento do arquivo e o status do arquivo e sinalizadores de acesso). Isso complica o uso seguro de descritores de arquivo como recursos, pois quando os programas compartilham o acesso à mesma descrição de arquivo aberta, eles podem interferir no uso uns dos outros alterando seu deslocamento ou se é bloqueador ou não, por exemplo. Em sistemas operacionais que são projetados especificamente como sistemas de capacidade, muito raramente há qualquer estado mutável associado a uma capacidade em si.

A tabela do descritor de arquivo de um processo Unix é um exemplo de uma C-list .

Veja também

Referências