LEIC/LERC 2010/11

Sistemas Operativos

Aula 6

Introdução às Entradas/Saídas em Unix

 

Objectivo



Introdução

Serão utilizados vários exemplos da forma pacote.tgz que deve descomprimir com o comando:

  tar zxvf pacote.tgz

1. Acesso a Ficheiros

a) Observe os exemplos de acesso a ficheiros constantes no slide.

b) Descomprima aula6-open-write.tgz e observe o código fonte. Compile, execute e verifique que o ficheiro test.txt tem a mensagem esperada.

c) Descomprima aula6-open-read.tgz e observe o código fonte. Compile, execute e verifique que o output impresso no ecrã é o esperado.

2. Interface de Entradas/Saídas

A interface de E/S Unix é baseada num mecanismo de dupla indirecção representado neste slide. A file descriptor table permite tratar vários canais de comunicação da mesma forma (ex. terminais, ficheiros, sockets, pipes) utilizando file descriptors.

Por convenção, os três primeiros file descriptors são reservados (slide): 0 - STDIN (standard input, associado ao teclado), 1 - STDOUT (standard out, associado ao display), 2 - STDERR (standard error, associado ao display).

a) Modifique o exemplo open-write.c substituindo o primeiro argumento (fd) da instrução write por '1' e verifique que a mensagem é escrita no ecrã.

b) Modifique o exemplo open-read.c substituindo o primeiro argumento (fd) da instrução read por '0' e verifique que a mensagem é lida do teclado.

3. Redirecção de Entradas/Saídas

O mecanismo de E/S permite rediccionar transparentemente a entrada (0) ou a saída (1) para um canal diferente. A chamada sistema dup(fd) permite copiar o conteúdo do file descriptor fd para a primeira posição livre da tabela.

a) Compile e execute o exemplo aula6-redir.tgz. Verifique que a saída é redireccionada para o ficheiro test.txt (slide).

b) Confirme que o printf utiliza o fd 1 para escrever no ecrã. Sugestão: substitua a função write por um printf.

Material de Apoio

 


Exercícios

1. Acesso a ficheiros

a) Modifique o exemplo aula6-open-read.tgz de modo a fazer a leitura integral de um ficheiro e a imprimir o seu conteúdo no ecrã.

b) Modifique a solução da alínea a) de modo que o resultado da leitura seja colocada no ficheiro 'test-out.txt'.

c) Implemente o comando mycp <ficheiro_origem> <ficheiro_destino> modificando a alínea b). Faça alguns testes com ficheiros de dimensões diferentes e verifique que o resultado está correcto utilizando o comando diff.

2. Exemplo de utilização do debugger DDD no Sistema de Ficheiros SNFS

O exemplo que segue mostra o uso da ferramenta DDD no debugging de um programa de teste do servidor SNFS da 2ª parte do projecto cujo código base foi disponibilizado na página da cadeira.

a) -Descomprimir o pacote snfs+sthreads+skel.tar.gz (ler as instruções do ficheiro README.txt que acompanha o pacote);

b) -Executar o comando make na directoria snfs+strhreads;

c) -Lançar o servidor SNFS snfs+strhreads/snfs_server através do executável ./server;

d) -Abrir outro terminal e executar na directoria snfs+strhreads/test-snfs o debugger DDD com argumento o ficheiro de teste 01myfs01 (i.e., ddd 01myfs01 )

e) -Criar um breakpoint na linha do programa indicado na figura ;

f) -Executar o programa primindo o botão Run (ver a figura anterior);

g) -Em correspondência do breakpoint primir o botão Step que vai efectuar um salto à 1ª instrução da função my_open( ) definida no módulo myfs.c ;

h) -Executar a passo a passo as instruções da função primindo o botão Next até instrução indicada na figura, e premir o botão Step que provoca um salto para a 1ª instrução da função snfs_lookup definida no módulo snfs_api.c ;

h) -Executar de novo a passo a passo as instruções da função primindo o botão Next até à instrução indicada na figura, e premir o botão Step que provoca um salto para a 1ª instrução da função remote_call do módulo snfs_api.c . O pedido é enviado ao servidor através da chamada à função sendto( ) e a resposta é recebida através da rotina recvfrom( ) da função remote_call.

Analogamente, é possível efectuar o debugging do servidor através da execução passo a passo das suas instruções (e da análise do conteúdo das variáveis). Por exemplo, a criação de breakpoints no código das tarefas consumidoras e seguindo as modalidades de execução Next e Step é possível acompanhar todo o percurso de um pedido (e respectiva resposta) ao sistema de ficheiros. Para o debugging do servidor:


Exercício Suplementar

Pipes

Obtenha o exemplo sobre pipes (aula6-pipe.tgz) e analise o código para ver o uso da primitiva pipe. Desenvolva um programa que crie dois processos: um emissor e um receptor. O emissor vai ler do teclado mensagens que serão passadas por um pipe para o receptor.

Nota : As únicas instruções de E/S que pode utilizar são pipe, read e write.