arquivo

Descrição

É o componente básico de qualquer sistema Unix-like. Nesses sistemas, quase todas as coisas são tratadas como arquivos e possuem localização dentro do sistema de arquivos.

Tipos de arquivos

No Linux, um arquivo pode ser comum ou especial.

  • arquivo comum – armazena informações e pode ser de texto, de áudio, de imagem, binários, etc.
  • diretório – contém outros arquivos e/ou outros diretórios.
  • dispositivo – representa um dispositivo físico (hardware) do sistema. Existem dois tipos:
    • de caracteres – as operações de E/S são feitas de forma sequencial.
    • de blocos – as operações de E/S são feitas usando blocos de caracteres.
  • link simbólico – aponta para outro arquivo.
  • pipe – utilizado para comunicação entre processos.
  • socket – utilizado para comunicação entre processos.

No sistema, é possível identificar o tipo do arquivo usando o comando ls ou o comando file. Por exemplo, se queremos informações sobre o arquivo teste, basta digitar

ls -l teste

Suponha que a saída do comando é mostrada abaixo.

-rw-rw-r−− 1 aluno aluno 7743 Jan 20 16:52 teste

O campo -rw-rw-r−− indica o tipo e as permissões do arquivo, onde o primeiro caractere “-” informa que teste é um arquivo comum e os outros caracteres informam que o dono do arquivo (aluno) pode ler e escrever no arquivo, o grupo do arquivo (aluno) também pode ler e escrever no arquivo, mas os outros usuários só podem ler.

Também podemos usar

file teste

para verificar o tipo do arquivo. A resposta abaixo informa que teste é um arquivo de texto que usa o conjunto de caracteres Unicode com a codificação UTF-8.

teste: UTF-8 Unicode text

A tabela abaixo mostra como os tipos de arquivos são referenciados dentro do Linux.

Tipo Representação
arquivo comum
diretório d
dispositivo de caracteres c
dispositivo de blocos b
link simbólico l
pipe p
socket s

Operações de E/S

Existem dois mecanismos básicos para conectar um processo a um arquivo:

  • file descriptor ou fd (descritor de arquivo) – fornece uma interface de baixo nível para as operações de E/S. É representado por um objeto do tipo “int”.
  • Stream (fluxo) – fornece uma interface de alto nível para as operações de E/S. É representado por um objeto do tipo “FILE *”.

A interface do fd permite apenas funções simples para transferência de blocos de caracteres. O uso de fd é importante quando há a necessidade de operações de E/S em modos especiais como, por exemplo, polled (comunicação síncrona).

A interface do stream permite funções mais complexas com operações de E/S formatadas. O uso de streams é importante quando se deseja garantir a portabilidade para outros tipos de sistemas (especialmente para os sistemas não-GNU).

Na realidade, a interface do stream é construída a partir dos descritores. Assim, os descritores de arquivo são usados para referenciar todo tipo de arquivo aberto no sistema (mesmo que isto seja ignorado pelo usuário). Isto ocorre porque apenas o kernel pode executar operações de E/S e ele só atende pedidos feitos através das chamadas de sistema (interface de baixo nível).

Descritor de arquivo

No Linux, o shell normalmente opera com três descritores de arquivo sempre abertos: um arquivo que serve de entrada padrão dos dados; um arquivo utilizado como saída padrão dos dados; e um arquivo onde as mensagens de erros são gravadas. Estes descritores são definidos em /usr/include/unistd.h conforme a tabela abaixo.

FD Nome Descrição
0 stdin (standard input) Entrada padrão (normalmente, o teclado)
1 stdout (standard output) Saída padrão (normalmente, o terminal)
2 stderr (standard error) Erro padrão (normalmente, o terminal)

 

Quando um processo é criado a partir do shell, ele herda cópias desses descritores. Se redicionadores de E/S são especificados na linha de comandos, o shell altera a definição dos descritores antes de inicializar o processo.

Cada processo possui uma tabela (process descriptor table) com informações necessárias a sua execução. Esta tabela aponta para uma outra tabela (file descriptor table) que contém ponteiros para todos os arquivos abertos do processo. Esta tabela já é criada com as três primeiras células apontando para os arquivos padrão: stdinstdout e stderr. Quando algum outro arquivo é aberto, uma nova entrada na tabela é criada no primeiro slot disponível.

Exemplos

No Linux, o conjunto dos descritores abertos de um processo pode ser visto em /proc/PID/fd/ onde PID é o identificador do processo. Por exemplo, para ver o PID do shell sendo usado em um terminal, digite

ps

Suponha que a resposta é mostrada abaixo. Portanto, o PID do shell bash é 4212.

PID TTY TIME CMD
4212 pts/0 00:00:00 bash
4140 pts/0 00:00:00 ps

 

Para ver os arquivos abertos para o bash, basta digitar

ls -l /proc/4212/fd

A saída abaixo mostra que existem 4 arquivos abertos: 0 (stdin), 1 (stdout), 2 (stderr) e 255 (cópia dos fds para uso interno do bash caso os fds padrões sejam redirecionados). Note que os arquivos mostrados são links para o arquivo /dev/pts/11.

total 0 
lrwx−−−−−− 1 aluno aluno 64 Abr 25 13:28 0 -> /dev/pts/11 
lrwx−−−−−− 1 aluno aluno 64 Abr 25 13:28 1 -> /dev/pts/11 
lrwx−−−−−− 1 aluno aluno 64 Abr 25 13:28 2 -> /dev/pts/11 
lrwx−−−−−− 1 aluno aluno 64 Abr 25 14:04 255 -> /dev/pts/11

Entradas em /dev/pts são na realidade pseudo-terminais: aplicações usam esses terminais para receber e mostrar dados. Para verificar isto, digite

ls -l /dev/pts/11

Abaixo, é mostrada uma possível saída.

crw−−w−−−− 1 aluno tty 136, 11 Abr 25 14:34 /dev/pts/11

Limites

  • Para saber o número máximo de fds suportados no sistema, digite

cat /proc/sys/fs/file-max

Abaixo é mostrada uma possível saída.

795346

  • Para verificar o uso atual dos arquivos no sistema, basta digitar

cat /proc/sys/fs/file-nr

A resposta abaixo mostra que 11.264 fds já foram alocados (inclui fds já liberados), zero fds alocados e ainda não usados e no máximo 795.346 arquivos podem ser abertos no sistema ao mesmo tempo.

11264 0 795346

  • Para ver o número máximo de fds que um processo pode alocar, use o comando ulimit

ulimit -Sn

Abaixo a resposta do kernel 4.15.

1024

  • Para ver o número máximo de fds que o administrador do sistema (root) pode autorizar para os processos

ulimit -Hn

A possível resposta é

4096

Observações

  • O comando fuser identifica os processos que estão usando um determinado arquivo.
  • O comando lsof lista os arquivos abertos.
  • O comando stat fornece informações sobre arquivos.

 

Sumário      |      Topo