Escolar Documentos
Profissional Documentos
Cultura Documentos
1 Introdução
O enunciado que se apresenta tem como objetivo avaliar os estudantes e aferir os seus
conhecimentos subordinados aos seguintes tópicos:
- FIFOs e threads (consolidação de conhecimentos);
- Temporizadores e sinais
2 Processo de avaliação
Deve ser implementado um programa na linguagem C, destinado a ser executado na plataforma
de testes Pandora.
O “Contest” do Pandora chama-se SO2023 – Teste 3 e cada aluno irá submeter um ficheiro com o
nome “main.c” no Pandora. Este programa será submetido a um total de 6 testes. As pontuações
atribuídas a cada teste são:
● Teste 1: 1 valor
● Testes 2 e 3: 2 valores cada
● Testes 4, 5 e 6: 5 valores cada
Todas as submissões serão submetidas a uma avaliação presencial na aula, e a nota final do teste
será o resultado conjunto do pandora e avaliação presencial.
3 Exercício
O propósito desta aplicação é dar continuidade ao desenvolvimento de um servidor responsável
pela transmissão de comandos à distância e pela receção de telemetria de carros de corrida
durante uma competição desportiva.
O ponto de partida consiste no programa desenvolvido no teste 2, podendo utilizar a vossa
solução ou a disponibilizada no Moodle na pasta Teste 2 (localizada no enunciado do teste 2).
Neste terceiro teste, o servidor receberá três melhoramentos.
Para tal, e para que o vosso servidor continue a processar as mensagens dos carros, é
necessário que criem uma thread adicional para este efeito.
Nesta FIFO, poderão receber mensagens de 9 bytes (sem qualquer terminador) no formato:
onde X é o número do carro que se despistou (de 1 a 9). Quando recebem uma mensagem
destas, devem:
● imprimir no ecrã a mensagem Carro X despistou-se
● terminar a thread do servidor correspondente ao carro que se despistou (com recurso à
chamada pthread_cancel).
Para os carros despistados, a tabela de resultados impressa no final deve refletir a informação da
última mensagem recebida antes de o carro se despistar. Exemplo com dois despistes:
ID Volta Tempo
1 10 12.500000
2 10 13.600000
3 10 14.700000
4 10 15.800000
5 1 0.000000
6 10 17.000000
7 5 4.200000
8 10 19.200001
9 10 10.300000
Sempre que o processo do vosso servidor receber um sinal SIGUSR2, deverá imprimir a seguinte
mensagem:
Bandeira amarela recolhida
apagar todas as FIFOs, e terminar o processo imediatamente (exit(0)). Não será, neste caso,
impressa a tabela com os resultados da corrida.
4 Execução do servidor
O servidor aceita um parâmetro que é um número inteiro, e que serve para o Pandora escrever o
número do teste. Sendo assim a função main deve ser declarada da seguinte forma:
int main(int argc, char **argv)
De seguida, deverá executar o seguinte código que vai lançar o script dos clientes (é diferente do
utilizado anteriormente!):
if (argc >= 2)
{
sprintf (comando, "bash testscript.sh %d %s 2>&1", getpid(), argv[1]);
FILE *pipe = popen(comando, "r");
if (pipe == NULL)
{
printf("Erro no comando a chamar testscript \n");
perror ("Erro :");
}
}
else
{
printf ("Numero de argumentos invalido\n");
exit(EXIT_SUCCESS);
}
Foi desenvolvido um programa em C, para ser cliente do servidor, está disponível no moodle e se
chama cliente.c.
Para chamar o cliente.c compilado devem invocar o seguinte script (é diferente do utilizado
anteriormente!):
chmod +x ./client
./client $1 $2
Com este script colocado na diretoria do vosso projeto, ao chamarem o vosso servidor com:
$ ./output/main 1
deverão ver o seguinte comportamento (reparem o valor dos números e o efeito causado no
servidor):
Msg: | 1 | 01 | 3 | 41.5 | 050 | 060 | Soft |
Msg: | 7 | 01 | 3 | 41.5 | 050 | 060 | Soft |
Msg: | 2 | 01 | 3 | 41.5 | 050 | 060 | Soft |
Msg: | 3 | 01 | 3 | 22.5 | 050 | 060 | Soft |
Msg: | 9 | 01 | 3 | 01.5 | 050 | 060 | Soft |
Bandeira amarela levantada
Carro 3 despistou-se
Msg: | 1 | 10 | 3 | 99.9 | 050 | 060 | Soft |
Msg: | 4 | 01 | 3 | 41.5 | 050 | 060 | Soft |
Msg: | 6 | 01 | 3 | 41.5 | 050 | 060 | Soft |
Bandeira amarela recolhida
Certifique-se de que as mensagens escritas pelo servidor que desenvolveram estão devidamente
formatadas como mostrado, isso tem influência nos testes automáticos no Pandora.
5 Testes
O Pandora irá executar um total de 6 testes. O aluno terá visibilidade dos resultados de 2 deles.
Nos restantes 4 testes os resultados são ocultos exceto o feedback se passou ou não.
O aluno tem um total de 20 tentativas para executar o programa e passar nos testes.
De modo a ajudar o aluno com os testes ocultos segue abaixo uma descrição textual do que
ocorre em cada teste.
5.1 Teste 1
Cada carro envia 1 mensagem para o servidor
5.2 Teste 2
Cada carro envia 2 mensagens para o servidor, sequencialmente (2 mensagens para fifo 1, 2
mensagens para fifo2 …)
5.3 Teste 3
Cada carro envia 1 mensagem de forma não sequencial
5.4 Teste 4
Cada carro envia 2 mensagens de forma não sequencial.
Ocasionalmente, são enviados sinais SIGUSR1 / SIGUSR2 para o processo do servidor.
5.5 Teste 5
Cada carro envia 2 mensagens de forma não sequencial, não chegando nenhum deles a enviar
mensagem com volta 10.
5.6 Teste 6
Cada carro envia quantidade diferentes de mensagens de forma não sequencial.
Dois carros vão despistar-se.