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
4. SinaisO 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çãowrite
por umprintf
.
Copie o ficheiro signals.c para a sua área de trabalho e compile, utilizando o comando:
gcc -g -o signals signals.ca) 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 pidJustifique o resultado.
kill -TSTP pid
kill -KILL pid ou kill -9 pid
open
, close
, read
, write
(slide).
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
emy_close
para abrir/fechar um ficheiro (test-myopen.c).-
my_write
emy_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'.
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
.