Sistema de arquivos

Os sistemas de arquivos do UNIX possuem as seguintes características fundamentais:

Os principais sistemas de arquivos usados para a formatação de discos locais em Linux são o ext2, ext3, reiser, xfs e jfs, entre outros. Os sistemas mais recentes implementam o conceito de journaling. Os links a seguir fornecem mais detalhes sobre esse conceito e os sistemas de arquivos mais usados:

Hierarquia de diretórios

Os diretórios de um sistema de arquivos no UNIX têm uma estrutura pré-definida, com poucas variações. Essa estrutura normalmente segue a padronização sugerida pelo documento Filesystem Hierarchy Standard (resumo do RedHat 9).

A seguir ilustramos os principais diretórios de um sistem Linux típico:

Descritores e Streams

Quando um processo abre um arquivo, o núcleo do sistema operacional precisa criar várias estruturas de dados para gerenciar seu uso. Duas estruturas de dados são importantes nesse contexto: a tabela de descritores de arquivos (file descriptor table) e a tabela de arquivos do sistema (system file table).

Tabelas no sistema de arquivos

Um descritor de arquivo constitui uma interface de baixo nível para o acesso ao mesmo. Por ser simplesmente um índice em uma tabela local, geralmente é representado por uma variável do tipo int.

O mecanismo de streams provê uma interface mais abstrata para acesso aos arquivos, construída a partir dos descritores. Essa abstração provê uma maior homogeneidade no acesso aos diversos tipos de arquivos e travamento (locking) automático, além de um controle mais fino sobre os mecanismos de buferização do arquivo em memória. Streams são definidos por variáveis do tipo FILE *.

Deve-se observar que, enquanto descritores de arquivos são herdados por processos filhos, streams não o são.

Arquivos padrão

Cada processo sempre possui três descritores de arquivos pré-definidos, os chamados arquivos padrão, geralmente definidos no arquivo unistd.h:

Os arquivos padrão são geralmente associados ao terminal onde o processo foi lançado, mas podem ser redirecionados para outros arquivos através do shell (operadores >, <, >>, |, etc) ou dentro do próprio processo, através das funções de abertura de streams (fopen, freopen).

Operações básicas em arquivos

O núcleo do sistema operacional UNIX disponibiliza as seguintes chamadas de sistema (syscalls) para as operações básicas de entrada/saída em arquivos, que operam sobre descritores: open, close, read, write e fcntl. As demais operações são normalmente implementadas como funções de biblioteca que fazem uso dessas chamadas.

Atividades

Execute o programa a seguir e explique o que ocorre com sua saída:

#include <stdio.h>
 
main ()
{
  fprintf (stdout, "a ") ;
  fprintf (stderr, "imprimi a ") ;
  fprintf (stdout, "b ") ;
  fprintf (stderr, "imprimi b ") ;
  fprintf (stdout, "\n") ;
  return 0 ;
}

Escreva um programa mycp que efetua a cópia de um arquivo em outro:

mycp arq1 arq2

Antes da cópia, arq1 deve existir e arq2 não deve existir. Mensagens de erro devem ser geradas caso essas condições não sejam atendidas ou o nome dado a arq2 seja inválido.

Escreva um programa em C que gere uma listagem do diretório corrente no seguinte formato:

tamanho     nome e tipo
  115234    arquivo
    4096    diretorio/
      21    link->
    1024    socket@
    1024    pipe=

Modifique o programa anterior para incluir na listagem as permissões das entradas do diretório:

perms        tamanho   nome e tipo
rw-r--r--     115234    arquivo
rwx------       4096    diretorio/
rwxrwxrwx         21    link->
rw-rw-rw-       1024    socket@
rw-rw----       1024    pipe=

Idem, para a data de última modificação de cada entrada.