Você sabia que o comando kill não serve para apenas "matar" um processo? Esta é apenas uma de suas finalidades. Na verdade trata-se de comunicação por sinais, um IPC (InterProcess Communication) muito útil e simples de ser usado. Existem outros sinais que podem ser muito úteis, principalmente em programação C. Os exemplos deste artigo são todos em C.
Como você leu no capítulo anterior, o que será feito, ou seja, qual o comportamento de cada programa ao receber um sinal é programado pelo autor. Sou eu, enquanto programador, que tenho inclusive que tratar o sinal 15, para terminar. Lembra, o 15 é uma morte controlada, onde eu dou uma arma para o programa. Cabe a você programador decidir em sua lógica apertar o gatilho (ou mesmo ignorar a arma). Se você não fizer nada disso o Sistema Operacional fará (caso do HUP no capítulo anterior).
Logo alguns sinais que fazem determinadas coisas tem um significado e uma ação padrão do Sistema Operacional. Alguns sinais são chamados "não mascaráveis", ou seja, eu não posso substituir a ação padrão, como no caso do sinal 9 (nada que eu tente fazer me livrará da morte por sinal 9).
Alguns sinais possuem funções interessantes:
Sinal 1: só para formalizar. Significa reinício do programa. O programador deve escrever uma rotina que faça o que ele considera como reinício (como reler arquivos de configurações por exemplo). Senão o tratamento padrão é o encerramento. Este sinal é chamado de SIGHUP.
Sinal 2: Sinal chamado de SIGINT. Causa uma interrupção no programa. Falando em termos práticos, é um sinal 2 que o programa recebe quando se pressiona Control+C.
Sinal 15: esta é a solicitação de morte, chamada de SIGTERM. Ao receber um sinal 15 o processo deveria preparar-se para terminar, fazendo "seus últimos pedidos" e ele mesmo encerrando normalmente sua execução. Claro, isto se o programador tratar o sinal, senão será o Sistema Operacional quem o fará.
Sinal 9: SIGKILL. Este é a morte indefensável. Não pode ser mascarado, ou seja, o programador não consegue substituir a rotina de tratamento do Sistema Operacional que simplesmente tira o processo da fila de prontos. Deve ser usado em último caso, pois um sinal 15 é mais elegante por dar a chance ao processo de se preparar para sua morte.
Sinal 14: SIGALRM. Adoro este sinal. Um desconhecido que permite coisas fantásticas. Posso agendar antecipadamente o envio sinal. Tratarei dele com mais detalhes.
Sinal 20: SIGTSTP. Este sinal de STOP faz com que o processo interrompa a sua execução. Veja, ele não termina, apenas interrompe. Se não for tratado pelo programa o Sistema Operacional irá tirar ele da fila de prontos, mas sem o encerrar. Bom exemplos falam mais alto: quando tu digita Control+Z tu gera um sinal 20. Captou? (processo fica parado, um fg volta a ele ou um bg para colocar em background).
Bom, não vou descrever aqui todos os sinais. Resta dizer que a maioria deles eu posso subverter a ação ou mesmo desligar. Ainda tem sinais que não tem função específica podendo ser usado para finalidades diversas. Um deles é o 10. Posso, em minha lógica de programação, determinar que o sinal 10 teria o significado de "imprima novamente teus dados" e assim por diante.
Ou melhor, um processo irá ler da memória e outro escrever. Não posso ler se ainda não escrevi, logo o processo que irá ler pode ficar esperando o sinal 10 e o processo que irá escrever envia o sinal 10 quando terminou de escrever.
Sacou como sinais podem ser algo útil em uma programação?
[5] Comentário enviado por rafasmart em 20/05/2008 - 15:27h
Artigo muito bom, parabéns!
só fiquei com uma dúvida... quando envio o mesmo sinal, mais de uma vez para o morroNao.c, ele não é mais tratado pela função morroNao. por exemplo com kill -20 <PID> aparece a mensagem "o seu mane...", mas se novamente fizer kill -20 <PID>, ele fica em STOP; e semelhantemente é finalizado se fizer kill -15 2 vezes. por que?
[6] Comentário enviado por elgio em 20/05/2008 - 15:49h
Opa!
Este comportamento que tiveste não é assim não!
Na minha execução não importa quantas vezes tu envie e em qual ordem, o morroNao só morre com o sinal 9!
[11] Comentário enviado por rafasmart em 20/05/2008 - 16:44h
não era plataforma (testei num x86), eram aquelas opções mesmo(-ansi mais especificamente), compilando sem ela funcionou normal (era um alias que eu tinha deixado para sempre compilar em ansi C)
[15] Comentário enviado por davis.peixoto em 21/05/2008 - 21:41h
cara, seus artigos são sempre muito bons.
De verdade. Às vezes desanimo de acompanhar o VOL por causa de ler dicas do tipo
"Pessoal, vcs pode usar o comando cd para trocar de diretório, o ls para listá-lo e o clear para limpar a tela. Espero ter ajudado com a introdução ao poderoso shell."
Lembro do artigo que você escreveu sobre SYN Flood, ACK Flood. Aquilo me motivou muito a meter mais as caras em padrões e tudo o mais.
Parabéns pelo artigo e obrigado por proporcionar essa leitura.
[17] Comentário enviado por gjr_rj em 30/08/2008 - 01:32h
elgio,
antes de tudo, parabéns. Me esforço para fazer artigos iguais aos seus, quando acho que estou perto, leio um artigo desse e vejo que estou a "anos luz".
[18] Comentário enviado por jefers0n em 25/03/2009 - 20:23h
Elgio, meus parabens. Me ajudou bastante, pois tava tentando entender um pouco mais sobre sinais, ainda falta aprender muita coisa, mas ja me clareou as idéias...Excelente artigo (como sempre).
[23] Comentário enviado por ramon.rdm em 23/04/2011 - 21:13h
Excelente seu artigo companheiro!
Ew nunca ri e aprendi tão bem!
Seus exemplos vão direto ao ponto.
Entrei apenas para resolver um problema da universidade e acabei lendo ele todo.
Meus parabéns!
Abraço!