Portal do Governo Brasileiro

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.

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. 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.
-rw-rw-r-- 1 aluno aluno 7743 Jan 20 16:52 teste
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 (números ↔ caracteres) com a codificação UTF-8 (números ↔ binários).
teste: UTF-8 Unicode text

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

TipoRepresentaçã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:

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.

FDNomeDescrição
0stdin (standard input) Entrada padrão (normalmente, o teclado)
1stdout (standard output)Saída padrão (normalmente, o terminal)
2stderr (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: stdin, stdout 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

Observações

 

  Topo   |   Guia   |   Home