Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anterior Revisão anterior | |||
pua:sistema_de_arquivos [2008/08/08 19:29] – maziero | pua:sistema_de_arquivos [2008/09/21 15:36] (atual) – maziero | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Sistema de arquivos ====== | ||
+ | |||
+ | Os sistemas de arquivos do UNIX possuem as seguintes características fundamentais: | ||
+ | |||
+ | * Estruturados na forma de uma árvore única, iniciando pelo diretório "/", | ||
+ | * Há suporte para arquivos, diretórios e links (atalhos). | ||
+ | * Os arquivos podem ter qualquer nome, usando quaisquer caracteres, com distinção entre maiúsculas e minúsculas. Os nomes são normalmente limitados a 255 caracteres. | ||
+ | * O caractere separador de diretórios é o "/" | ||
+ | * Arquivos e diretórios cujos nomes começam com " | ||
+ | * As extensões são normalmente usadas apenas para facilitar a vida do usuário, mas não são importantes para o sistema operacional, | ||
+ | * Os arquivos e diretórios possuem permissões de acesso controláveis por seus proprietários. | ||
+ | |||
+ | 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 // | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ====== Hierarquia de diretórios ====== | ||
+ | |||
+ | Os diretórios de um sistema de arquivos no UNIX têm uma estrutura pré-definida, | ||
+ | |||
+ | 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//). | ||
+ | |||
+ | * Cada processo possui sua própria **tabela de descritores de arquivos**. Os descritores de arquivos usados pelo processo nas operações sobre os arquivos são índices ou ponteiros para entradas nessa tabela local. | ||
+ | * O sistema operacional possui uma **tabela de arquivos do sistema**, que possui uma entrada para cada open ativo. Essa tabela possui várias entradas, sendo uma dela um apontador (ou índice) para a tabela de //i-nodes// (ou // | ||
+ | |||
+ | {{ filetables.png | ||
+ | |||
+ | 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 '' | ||
+ | |||
+ | O mecanismo de //streams// provê uma interface mais abstrata para acesso aos arquivos, construída a partir dos descritores. | ||
+ | |||
+ | 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 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 ('' | ||
+ | |||
+ | ====== Operações básicas em arquivos ====== | ||
+ | |||
+ | O núcleo do sistema operacional UNIX disponibiliza as seguintes chamadas de sistema (// | ||
+ | |||
+ | * [[Operações usando descritores]] | ||
+ | * [[Operações usando streams]] | ||
+ | * [[Operações em meta-dados]] | ||
+ | * [[Operações em diretórios]] | ||
+ | |||
+ | ====== Atividades ====== | ||
+ | |||
+ | Execute o programa a seguir e explique o que ocorre com sua saída: | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | |||
+ | main () | ||
+ | { | ||
+ | fprintf (stdout, "a ") ; | ||
+ | fprintf (stderr, " | ||
+ | fprintf (stdout, "b ") ; | ||
+ | fprintf (stderr, " | ||
+ | fprintf (stdout, " | ||
+ | return 0 ; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Escreva um programa '' | ||
+ | |||
+ | < | ||
+ | mycp arq1 arq2 | ||
+ | </ | ||
+ | |||
+ | Antes da cópia, '' | ||
+ | |||
+ | Escreva um programa em C que gere uma listagem do diretório corrente no seguinte formato: | ||
+ | |||
+ | < | ||
+ | tamanho | ||
+ | 115234 | ||
+ | 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 | ||
+ | rw-r--r-- | ||
+ | rwx------ | ||
+ | rwxrwxrwx | ||
+ | rw-rw-rw- | ||
+ | rw-rw---- | ||
+ | </ | ||
+ | |||
+ | Idem, para a data de última modificação de cada entrada. | ||