LEIC/LERC 2008/09

Sistemas Operativos

Aula 5

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 xvf pacote.tar

1. Acesso a Ficheiros

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

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

c) Descomprima aula5-open-read.tar 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, vulgo teclado), 1 - STDOUT (standard out, vulgo display), 2 - STDERR (standard error, vulgo 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 aula5-redir.tar. 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.

4. Sinais

Copie o ficheiro signals.c para a sua área de trabalho e compile, utilizando o comando:
      gcc -g -o signals signals.c

a) Execute o programa e pressione as teclas Ctrl-Z. Analise o código e justifique o output obtido.

b) Insira um chamada à função getchar() na função proc_SIGTSTP após o incremento da variável stoptimes. Compile e execute novamente o programa. Pressione Ctrl-Z 3 vezes seguidas. Pressione Enter 3 vezes. Justifique o resultado.

c) Altere o código de modo a que o programa não termine ao ser pressionado Ctrl-C. Ao receber um SIGINT a programa deverá imprimir no STDERR uma mensagem de aviso.

d) Abra outro terminal e execute os seguintes comandos:

kill -INT pid
kill -TSTP pid
kill -KILL pid ou kill -9 pid
Justifique o resultado.

Material de Apoio

 


Exercícios

1. Acesso a ficheiros

a) Modifique o exemplo aula5-open-read.tar 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 colocado 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. Implementação da Interface Sistema de Ficheiros do Cliente SNFS

Implemente agora a Parte II - Cliente SNFS, ponto 2 (Interface Sistema de Ficheiros) que é um dos requisitos para o 2º Checkpoint (consultar o enunciado do projecto pág. 6). Pretende-se implementar as funções my_open, my_close, my_read, my_write, my_delete e my_listdir da camada myfs.c que visa simular a interface E/S standard Unix para aceder ao sistema de ficheiros SNFS. O pacote sthreads+snfs-chk2-skel.tgz contém o esqueleto base sobre o qual desenvolver o sistema SNFS. Adopta uma arquitectura cliente-servidor (ver figura seguinte).

Para atingir este objectivo necessita de usar as funções da camada API SNFS. Apenas precisa alterar o ficheiro myfs.c. Assuma que pode ter no máximo 10 ficheiros abertos. O enunciado do projecto descreve com mais detalhe as funções. O pacote sthreads+snfs-test-parte-2.2.tgz contém um conjunto de testes. Note que estes testes só iram funcionar correctamente depois da implementação das funções da API SNFS.

- my_open e my_close para abrir/fechar um ficheiro (test-myopen.c).

- my_write e my_read para escrever/ler dados num ficheiro (test-myrw.c).

- my_remove para apagar um ficheiro ou um directório vazio (test-myremove.c). Nota: o directório root ('/') não pode ser apagado.

- my_optimize para optimizar a organização do sistema de ficheiros.

- my_diskusage para visualizar a utilização do sistema de ficheiros.

- my_listdir para listar o conteúdo de um directório (test-mylistdir.c). Nota: o directório root ('/') corresponde ao file handler SNFS '1'.


Exercício Suplementar

Pipes

Obtenha o exemplo sobre pipes (aula5-pipe.tgz) e analise o código para ver o uso da primitiva pipe. Desenvolva um programa que imprima a mensagem:

"O utilizador 'nome do utilizador' está na máquina com o IP:'IP da máquina'".

Para tal deverá executar o comando "who" com as opções "am" e "i" através da chamada da função "exevl". O stdout deste novo processo deverá ser redirecionado por um pipe pipe previamente criado no processo pai.

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