Sinais são usados quando se deseja enviar uma mensagem para um processo, mas esta mensagem não é um texto, mas sim um código cujo significado é pré determinado. Antes de mais nada, para dar o melhor exemplo possível, quando se executa um kill 7000 está se enviando para o processo 7000 o sinal de código 15 que significa algo como "Caro processo, queria gentilmente terminar a sua execução".
Como o sinal 15 significa terminar, o processo irá terminar a sua execução. Como todos já devem saber, se o "gentil" processo recusar-se a terminar, posso forçar com um kill -9 7000, onde envio para ele o sinal 9 que significa algo como: "Morra!" (uma vez disse em um curso que com sinal 15 eu dou a arma para o processo esperando que ele aperte o gatilho, depois de escrever o seu testamento, fechar suas finanças etc. Com o -9 é um tiro na testa sem aviso).
O fato é que sinais precisam ser devidamente tratados pelas aplicações. Todos eles! Se eu, enquanto programador, não escrever rotinas determinando qual o comportamento que minha aplicação terá ao receber um sinal, o tratamento padrão do Sistema Operacional será usado (que pode não ser muito agradável).
Por exemplo: acredito que muitos já usaram o sinal HUP ou 1, com um comando:
$ kill -HUP 700
ou mesmo:
$ kill -1 7000
O que ele faz? Ele "reinicia" o processo. Na verdade se você fizer um código em C como este, uma simples impressão em um laço infinito:
int main()
{
int a=0;
printf("Meu pid eh %i\n", getpid());
while(1) {
printf("Valor de a = %i\n", a);
a++;
sleep(3);
}
}
Eu o chamei de sinais1.c e seria legal se você tivesse condições de reproduzir os testes em seu
Linux.
Ao compilar e executar ele ele ficou imprimindo linhas com o valor de a de 3 em 3 segundos::
$ ./sinais1
Meu pid eh 8939
Valor de a = 0
Valor de a = 1
(...)
Em um outro terminal eu executei:
$ kill -HUP 8939
(e não será este comando no seu caso. Veja o valor do pid que o próprio programa imprimiu)
Este kill deveria REINICIAR o programa. Você tentou? O que aconteceu?
O fato é que o programa encerrou a sua execução. Sim, eu enviei para ele um sinal que ele, na minha lógica de programação, não está tratando. Isto é, eu não defini uma rotina de tratamento do sinal 1 (HUP). É minha tarefa fazer isto senão a rotina do sistema operacional será usada (que encerra).
Vamos guardar este código pois ele será a base deste artigo. Iremos incrementá-lo.