Neste trabalho iremos implementar uma calculadora que funciona através do mecanismo mais simples de comunicação interprocessos: passagem de sinais.
No Linux, sinais podem ser enviados a processos usando o programa kill -SIGNAL PID, onde SIGNAL é um sinal disponível no sistema (ver man 7 signal). Programas podem informar ao sistema como cada sinal deve ser tratado usando a função sigaction. Neste trabalho iremos implementar uma calculadora que recebe comandos através de sinais. O "protocolo" de comunicação será o seguinte:
Usaremos SIGUSR1 para incrementar o operando atual. Operandos começam em 0 e só podem ter valores positivos. Para passar à calculadora um operando com valor 3, basta enviar o sinal SIGUSR1 três vezes.
Usaremos SIGUSR2 para confirmar entradas de parâmetros. Após enviar a quantidade desejada de sinais SIGUSR1, o usuário da calculadora deve enviar um SIGUSR2 para confirmar o valor do operando. Quando um operando é confirmado, o programa deve imprimir na tela o valor do operando.
Logo após a confirmação de um operando via SIGUSR2, podemos enviar um operando. Usaremos SIGHUP para soma, SIGINT para subtração, e SIGALRM para igual. Ao receber cada operador, a calculadora deve imprimí-lo na tela; quando receber o operador igual, a calculadora deve imprimir o resultado na tela seguido de uma quebra de linha.
A calculadora deve iniciar no modo de recepção de operador, e deve voltar ao modo de recepção de operador após tratar o operador igual.
O sinal SIGSEGV sinaliza o final da operação da calculadora. A calculadora deve fechar após receber o sinal SIGSEGV.
Deve ser entregue o código do programa da calculadora. Documentação é opcional. Se entregue, deve ser em formato PDF e ter no máximo duas páginas.
A correção do trabalho será semi-automática; clique aqui para obter um exemplo do teste que será executado. Seu programa deverá seguir exatamente o protocolo de comunicação e formato de saída para ser compatível com o sistema de teste.
Descreva porque o script de teste (calctest.sh) faz chamadas a sleep. Proponha modificações à especificação da calculadora interprocesso para permitir que ela funcione corretamente sem chamadas a sleep. Implemente suas modificações.