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.
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.
[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!