Você está na página 1de 5

Sistemas Operativos

Enunciado do 3º Teste Prático


Prazo: 6 de novembro 06h00

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.

3.1 Thread e FIFO adicional


Além das FIFOs com mensagens de cada carro, o vosso servidor deverá agora também ler
mensagens da organização da corrida a partir da FIFO MASTER.in.

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:

SO-2023/2024- Daniel Silveira, João Madeira e João Craveiro 1


despisteX

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

3.2 Bandeira amarela (tratamento de sinais)


Sempre que o processo do vosso servidor receber um sinal SIGUSR1, deverá imprimir a seguinte
mensagem:
Bandeira amarela levantada

Sempre que o processo do vosso servidor receber um sinal SIGUSR2, deverá imprimir a seguinte
mensagem:
Bandeira amarela recolhida

3.3 Fim da corrida por tempo esgotado (temporizador e sinais)


Ao fim de 15 segundos (contados depois de o servidor ter criado todas as threads), a corrida deve
terminar imediatamente mesmo que 1 ou mais carros não tenham enviado a mensagem de volta
10.
Quando o tempo limite da corrida for atingido, devem imprimir a mensagem:
Fim da corrida por tempo esgotado

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)

SO-2023/2024- Daniel Silveira, João Madeira e João Craveiro 2


No início da vossa função main devem incluir a seguinte linha para configurar o buffering do
standard output, o que tem influência no resultado dos testes no Pandora:
setvbuf(stdout, NULL, _IONBF, 0);

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

SO-2023/2024- Daniel Silveira, João Madeira e João Craveiro 3


Corrida terminou para carro numero 1
Msg: | 2 | 10 | 3 | 41.5 | 050 | 060 | Soft |
Corrida terminou para carro numero 2
Msg: | 4 | 10 | 3 | 41.5 | 050 | 060 | Soft |
Corrida terminou para carro numero 4
Msg: | 5 | 01 | 3 | 22.5 | 050 | 060 | Soft |
Msg: | 5 | 10 | 3 | 42.5 | 050 | 060 | Soft |
Corrida terminou para carro numero 5
Msg: | 6 | 10 | 3 | 41.5 | 050 | 060 | Soft |
Corrida terminou para carro numero 6
Msg: | 7 | 10 | 3 | 41.5 | 050 | 060 | Soft |
Corrida terminou para carro numero 7
Msg: | 8 | 01 | 3 | 41.5 | 050 | 060 | Soft |
Msg: | 8 | 10 | 3 | 41.5 | 050 | 060 | Soft |
Corrida terminou para carro numero 8
Msg: | 9 | 10 | 3 | 11.5 | 050 | 060 | Soft |
Corrida terminou para carro numero 9
ID Volta Tempo
1 10 99.900000
2 10 41.500000
3 01 22.500000
4 10 42.500000
5 10 41.500000
6 10 41.500000
7 10 41.500000
8 10 41.500000
9 10 11.500000

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.

4.1 Terminação do programa


O servidor tem de apagar todas as fifos criadas.
As fifos são apagadas com a função unlink, acontecem após o close do descritor.

SO-2023/2024- Daniel Silveira, João Madeira e João Craveiro 4


Exemplo do unlink:
sprintf (filename, "CARRO%d.in", car_stat->id);
unlink(filename);
sprintf (filename, "CARRO%d.out", car_stat->id);
unlink(filename);

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.

SO-2023/2024- Daniel Silveira, João Madeira e João Craveiro 5

Você também pode gostar