Sistema de Entrada/Saída



Documentos relacionados
Comunicação entre Processos Canal de comunicação Arquitetura da comunicação Modelos de comunicação

Programação de Sistemas

Aspectos de Sistemas Operativos

I/O de baixo-nível em ficheiros

Comunicação entre pai e filho

3 Introdução às chamadas ao sistema

Funções de um SO. Gerência de processos Gerência de memória Gerência de Arquivos Gerência de I/O Sistema de Proteção

Estrutura Interna do KernelUNIX Sistema O. Estrutura Interna de Arquivos (1) Estrutura Seqüência. User application. Standard Unix libraries

6. Comunicação entre processos - Pipes

Sistemas Operativos: Introdução. March 14, 2011

Unix: Sistema de Arquivos. Geraldo Braz Junior

Arquivos binários em Python

Algoritmos e Programação Estruturada

Programação de Sistemas

Práticas de Desenvolvimento de Software

Capítulo 6. Gerenciamento de Arquivos. 6.1 Arquivos 6.2 Diretórios 6.3 Implementação (6.3.1 a 6.3.6) 6.4 Exemplos

implementação Nuno Ferreira Neves Faculdade de Ciências de Universidade de Lisboa Fernando Ramos, Nuno Neves, Sistemas Operativos,

Conceitos e Chamadas de Sistema

DEPARTAMENTO DE ENGENHARIA INFORMÁTICA FACULDADE DE CIÊNCIAS E TECNOLOGIA DA UNIVERSIDADE DE COIMBRA

Sistemas de Ficheiros. 1. Ficheiros 2. Directórios 3. Implementação de sistemas de ficheiros 4. Exemplos de sistemas de ficheiros

Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre

Manipulação de Arquivos

Introdução. Manipulação de arquivos em C. Estrutura de Dados II Prof Jairo Francisco de Souza

10) REGISTROS : Exemplos: var N,I: integer; A,B,C: real; CHAVE: boolean; CARAC: char; V: array[1..20] of real; M: array[1..10,1..

Sistema de Arquivos no Unix

Manipulação de Arquivos

PROG. DE COMPUTADORES II SI Arquivos

Programação de Sistemas

Tubos ou Pipes de Comunicação

O Comando find em Unix (breve resumo)

Processos. Programas e Processos. Aula 1 - Chamadas ao sistema. José Pedro Oliveira fork exit getpid, getppid wait, waitpid

Entradas/Saídas. Programação por espera activa Programação por interrupções

Introdução à Programação

SOP - TADS Sistemas de Arquivos Cap 4 Tanenmbaum

Tipo de Dados em Linguagem C

SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar

Fundamentos de Arquivos e Armazenamento Secundário

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

Capítulo 6 Sistemas de Arquivos

Trabalho Prático Nº1 Introdução ao C#.NET

Persistência de Dados

Algoritmos e Programação

Projeto: Camada Independente de Dispositivo

PIP/CA - Programa Interdisciplinar de Pós-Graduação em Computação Aplicada da UNISINOS ALGORITMOS & ESTRUTURAS DE DADOS

Manual do Desenvolvedor Criptografia de Arquivos do WebTA

Programação de Computadores I. Linguagem C Arquivos

Sistemas Operacionais II

Comunicação entre Processos

Comunicação Inter-Processo em Unix. Pipes FIFO (Named Pipes) Pipes

IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira

Mestrado em Engenharia Física Tecnológica

1 Funções básicas de implementação de arquivos

SO - Conceitos Básicos. Introdução ao Computador 2010/01 Renan Manola

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

SVCs para Controle de Processos no Unix (cont.) Sistemas Operacionais

Capítulo 2. VARIÁVEIS DO TIPO INTEIRO

Sistemas de Arquivos. Arquivos e Diretórios Características e Implementação Tadeu Ferreira Oliveira - tadeu.ferreira@ifrn.edu.br

Armazenamento de Dados. Prof. Antonio Almeida de Barros Junior

AULA 16 - Sistema de Arquivos

Componentes básicos de um sistema computacional. Cap. 1 (Stallings)

Programação com Posix Threads

DSS 08/09. Camada de Dados - JDBC. Aula 1. António Nestor Ribeiro /António Ramires Fernandes/ José Creissac Campos {anr,arf,jfc}@di.uminho.

Capítulo 5. ARQUIVOS E FUNÇÕES MATEMÁTICAS INTRÍNSECAS

Rotinas de Manipulação de Arquivos

Capítulo 6. Java IO - Ficheiros

Sistemas de Operação Sockets

LSOF - LiSt Open Files

Processos. Estados principais de um Processo: Contexto de um Processo. Nível de um Processo.

Interpretadores de comandos. Interpretadores de comandos de login válidos. Caracteres especiais. José Pedro Oliveira

Integração de Sistemas Embebidos MECom :: 5º ano

TRABALHANDO COM ARQUIVOS ENTRADAS/SAÍDAS (I/O) DE DADOS

Cliente-servidor com Sockets TCP

Alarmes e Erros CNC Proteo

Capítulo 14. ARQUIVOS DE SAÍDA, DE ENTRADA E INTERNOS

Implementação de um analisador léxico: a primeira etapa na construção do compilador Marvel

Conceitos de Sistemas Operacionais: Chamadas de Sistema. Prof Rafael J. Sandim

Bases de Dados 2007/2008. Aula 9

Introdução. Capítulo Breve sinopse

Memória partilhada em Unix SysV

DSS 09/10. DSS 09/10 Que métodos é que fazem parte de cada camada? Aplicações Multi-camada JDBC. Aula 3 DSS 09/10

Algoritmos e Programação _ Departamento de Informática

Resumo da Introdução de Prática de Programação com C. A Linguagem C

Licenciatura em Engenharia Informática Departamento de Engenharia Informática Instituto Superior de Engenharia do Porto

Capítulo 6 Sistemas de Arquivos

Aula 02. Introdução ao Linux

Transcrição:

Conteúdo Ficheiros (jpo@di.uminho.pt) Grupo de Sistemas Distribuídos Departamento de Informática Escola de Engenharia Universidade do Minho Sistemas Operativos 2006-2007 2 Descritores de ficheiros Descritores de ficheiros standard Kernel e ficheiros No kernel todos os ficheiros abertos são referenciados como FD (File Descriptors) Um FD é um número inteiro não negativo Sempre que um processo abre um ficheiro, o kernel retorna um FD Qualquer chamada ao sistema que opere sobre um ficheiro deve receber um FD como argumento (excepções: open e creat). Descritores de ficheiros standard Por convenção, os interpretadores de comandos (shells) em UNIX associam: o descritor 0 (zero) ao standard input, o descritor 1 (um) ao standard output, o descritor 2 (dois) ao standard error; Constantes POSIX STDIN FILENO, STDOUT FILENO, STDERR FILENO; Nota: constantes definidas no ficheiro de header <unistd.h> Conteúdo (system calls) 2 open - abrir ou criar ficheiro creat - criar ficheiro close - fechar descritor de ficheiro read - ler a partir de um descritor de ficheiro write - escrever para um descritor de ficheiro - reposicionar offset de leitura/escrita - obter informação sobre ficheiro fcntl - manipular o descritor de ficheiro ioctl - controlo de dispositivo... -... : valor de retorno s open e creat Valor de retorno das chamadas ao sistema As invocações das chamadas ao sistema básicas retornam, quase universalmente, o valor -1 em caso de erro e 0 ou um número positivo no caso de sucesso. Resumindo: erro - retornam o valor -1 sucesso - retornam um valor maior ou igual a 0 Que erro aconteceu? Quando uma chamada ao sistema retorna o valor -1, deve ser consultada a variável errno, declarada no ficheiro de header <errno.h>, para se obter informação mais detalhada sobre o erro. i n t open ( const char pathname, i n t f l a g s ) ; in t open ( const char pathname, in t flags, mode t mode ) ; in t creat ( const char pathname, mode t mode ) ; creat vs open A chamada ao sistema creat é equivalente a open(pathname, O WRONLY O CREAT O TRUNC, mode)

s open e creat Chamada ao sistema close Parâmetro flags Flag obrigatória: O RDONLY - abre o ficheiro em modo de leitura O WRONLY - abre o ficheiro em modo de escrita O RDWR - abre o ficheiro em modo de leitura/escrita Flags opcionais: O CREAT - cria o ficheiro se este não existir O TRUNC - se o ficheiro já existir, se for um ficheiro regular e se for aberto num modo que permita operações de escrita, será truncado a 0 (zero) O APPEND - abre o ficheiro em modo de append O SYNC - abre o ficheiro em modo síncrono... -... i n t close ( i n t fd ) ; Notas sobre terminação de processos Quando um processo termina, o kernel fecha automaticamente todos os ficheiros abertos e liberta também todos os locks de registo (record locks) a ele associados. Chamada ao sistema read Chamada ao sistema write s s i z e t read ( i n t fd, void buf, s i z e t count ) ; s s i z e t w r i t e ( i n t fd, const void buf, s i z e t count ) ; Valor de retorno Em caso de sucesso retorna o número de bytes lidos ou 0 na presença de fim do ficheiro. Em caso de erro retorna -1. Valor de retorno Em caso de sucesso retorna o número de bytes escritos. Em caso de erro retorna -1. Chamada ao sistema write: exemplo Exemplo: criação de um novo ficheiro (1) Chamada ao sistema 1 2 3 4 w r i t e (STDOUT FILENO, Ola\n, 4 ) ; 5 6 Criação de um novo ficheiro (sem tratamento de erros) Biblioteca C 1 #include <s t d i o. h> 2 3 4 p r i n t f ( Ola\n ) ; 5 6 fd = open ( / tmp / t e s t e. t x t, O WRONLY O CREAT, 0644); Exemplo: criação de um novo ficheiro (2) Exemplo: criação de um novo ficheiro (3) Criação de um novo ficheiro fd = open ( / tmp / t e s t e. t x t, O WRONLY O CREAT O TRUNC, 0644); Criação de um novo ficheiro fd = c r e a t ( / tmp / t e s t e. t x t, 0644);

Exemplo: leitura de um ficheiro Valores de retorno de chamadas ao sistema Listar o conteúdo do ficheiro /etc/passwd #define MAXBUFSIZE 256 i n t fd, n ; char buffer [MAXBUFSIZE ] ; fd = open ( / etc / passwd, O RDONLY ) ; while ( ( n = read ( fd, buffer, MAXBUFSIZE ) ) > 0) write (STDOUT FILENO, buffer, n ) ; Importante Todos os valores de retorno de chamadas ao sistema devem ser verificados. Tratamento de erros: informação adicional man 3 errno man 3 perror man 3 strerror Lista de tarefas Chamada ao sistema Tarefas Testar todos os exemplos anteriores. Será que todos os programas executam correctamente quando executados diversas vezes? Executar os programas anteriores com a ferramenta strace. Acrescentar tratamento de erros a todos os programas anteriores. o f f t ( i n t f i l d e s, o f f t o f f s e t, i n t whence ) ; Nota Esta chamada ao sistema não provoca nenhuma operação de Entrada/Saída (Input/Output); só altera o offset da próxima operação de E/S. Chamada ao sistema da família Parâmetro whence O cálculo da nova posição é efectuado: SEEK SET - a partir do ínicio do ficheiro SEEK CUR - a partir da posição corrente SEEK END - a partir do fim do ficheiro Determinar offset corrente off corrente = (fd, 0, SEEK CUR); i n t s t a t ( const char file name, struct s t a t buf ) ; i n t f s t a t ( i n t f i l e d e s, struct s t a t buf ) ; i n t l s t a t ( const char file name, struct s t a t buf ) ; da família : estrutura Conteúdo Estrutura struct s t a t dev t st dev ; / device / i n o t s t i n o ; / inode / mode t st mode ; / p r o t e c t i o n / n l i n k t s t n l i n k ; / number of hard l i n k s / u i d t st uid ; / user ID of owner / g i d t st gid ; / group ID of owner / dev t st rdev ; / device type ( i f inode device ) / o f f t s t s i z e ; / t o t a l size, i n bytes / b l k s i z e t s t b l k s i z e ; / b l o c k s i z e f o r f i l e s y s t e m I /O / b l k c n t t st blocks ; / number of blocks a l l o c a t e d / t i m e t st atime ; / time of l a s t access / t i m e t st mtime ; / time of l a s t modification / t i m e t st ctime ; / time of l a s t us change / ; 2

Criar ficheiro com buraco Criar ficheiro com buraco Exemplo i n t fd = c r e a t ( / tmp / hole. dat, 0644); w r i t e ( fd, ABC\n, 4 ) ; ( fd, 50000, SEEK SET ) ; w r i t e ( fd, DEF\n, 4 ) ; $ ls -l /tmp/hole.dat -rw-r--r-- 1 jpo jpo 50004 Nov 15 01:18 /tmp/hole.dat $ ls -ls /tmp/hole.dat 16 -rw-r--r-- 1 jpo jpo 50004 Nov 15 01:18 /tmp/hole.dat $ du -sk /tmp/hole.dat 16 /tmp/hole.dat Outros comandos - informação sobre sistemas de ficheiros fdisk -l /dev/hda tune2fs -l /dev/hda1 Criar ficheiro de acesso directo (1/2) Criar ficheiro de acesso directo (2/2) Parte 1/2 #include <stdio. h> #include <s t d l i b. h> s t a t i c struct r e g i s t o char codigo [ 8 ] ; char nome [ 2 0 ] ; array [ ] = 400, abc, 500, def, 300, ghi, 350, j k l ; Parte 2/2 i n t fd, i ; i f ( ( fd = open ( / tmp / reg. dat, O CREAT O WRONLY, 0644)) == 1) p e r r o r ( open ) ; e x i t ( EXIT FAILURE ) ; for ( i =0; i <sizeof ( array ) / sizeof ( struct r e g i s t o ) ; i ++) w r i t e ( fd, &array [ i ], sizeof ( struct r e g i s t o ) ) ; Conteúdo do ficheiro de acesso directo Ler ficheiro de acesso directo (1/3) $ od -c --width=8 /tmp/reg.dat 0000000 4 0 0 \0 \0 \0 \0 \0 0000010 a b c \0 \0 \0 \0 \0 0000020 \0 \0 \0 \0 \0 \0 \0 \0 0000030 \0 \0 \0 \0 5 0 0 \0 0000040 \0 \0 \0 \0 d e f \0 0000050 \0 \0 \0 \0 \0 \0 \0 \0 0000070 3 0 0 \0 \0 \0 \0 \0 0000100 g h i \0 \0 \0 \0 \0 0000110 \0 \0 \0 \0 \0 \0 \0 \0 0000120 \0 \0 \0 \0 3 5 0 \0 0000130 \0 \0 \0 \0 j k l \0 0000140 \0 \0 \0 \0 \0 \0 \0 \0 0000160 Parte 1/3 #include <stdio. h> #include <s t d l i b. h> typedef struct char codigo [ 8 ] ; char nome [ 2 0 ] ; r e g i s t o t ; Ler ficheiro de acesso directo (2/3) Ler ficheiro de acesso directo (3/3) Parte 2/3 r e g i s t o t buf ; struct s t a t f s t a t b u f ; i n t numreg ; i n t i ; i f ( ( fd = open ( / tmp / reg. dat, O RDONLY) ) < 0) p e r r o r ( open ) ; e x i t ( EXIT FAILURE ) ; i f ( f s t a t ( fd, & f s t a t b u f ) < 0) p e r r o r ( f s t a t ) ; e x i t ( EXIT FAILURE ) ; Parte 3/3 numreg = f s t a t b u f. s t s i z e / sizeof ( r e g i s t o t ) ; / L i s t a r registos por ordem inversa / for ( i = numreg 1; i >= 0; i ) ( fd, i sizeof ( r e g i s t o t ), SEEK SET ) ; read ( fd, &buf, sizeof ( r e g i s t o t ) ) ; p r i n t f ( %2d : %s, %s\n, i, buf. codigo, buf. nome ) ;

Conteúdo (1/2) 2 Bibliografia Advanced Programming in the Unix Environment (segunda edição) Autor: W. Richard Steven e Stephen A. Rago Homepage: http://www.apuebook.com/ Capítulo 3 - File I/O Capítulo 4 - Files and Directories Capítulo 5 - Standard I/O Library Linux Programming by Example - The Fundamentals Autor: Arnold Robbins Homepage: http://www.linux-by-example.com/ (2/2) Bibliografia The C Programming Language (segunda edição) Autores: Brian W. Kerninghan e Dennis M. Ritchie Homepage: http://cm.bell-labs.com/cm/cs/cbook/ C - A Reference Manual (quinta edição) Autores: Samuel P. Harbison and Guy L. Steele, Jr. Homepage: http://careferencemanual.com/ The GNU Coding Standards Homepage: http://www.gnu.org/prep/standards.html