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.
Para tratar um sinal, ou seja, configurar o que eu quero fazer quando receber este ou aquele sinal, se usa a chamada de sistema signal. Que coisa, um desavisado juraria que signal é para enviar um sinal, nada mais intuitivo! Mas não, kill envia, signal trata.
A chamada signal é até bem simples: eu determino qual função será usada pelo Sistema Operacional para tratar determinado sinal. Agora sim vamos melhorar o nosso código em C. Se possível, faça enquanto lê este artigo. Não dói nada (pelo menos é o que dizem!).
No caso vou determinar o que eu quero que aconteça quando meu programa receber o sinal HUP (1) que deve significar reiniciar.
Este meu simples programa fica incrementando a variável a eternamente e imprimindo ela na tela. Neste contexto, acredito que o "reiniciar" seria tornar a variável a como zero, certo? Veja que o significado depende da aplicação. Serviços geralmente interpretam isto como reler todos os arquivos de configuração.
No meu caso para não entrar em polêmica de passagem de parâmetros, tornei a variável a global para que uma função possa alterar ela (digo sempre aos meus alunos: NÃO USEM GLOBAIS. Espero que eles não leiam isto! Bom, se bem que eu digo que existem poucas situações onde globais é necessário. Creio estar em uma delas).
/* Rotina de tratamento de sinais. Ela sempre tem um parâmetro int que será o sinal que a invocou */
void tratahup(int sinal)
{
a= 0; // põe 0 na variavel a
}
int main()
{
signal(1, tratahup);
printf("Meu pid eh %i\n", getpid());
while(1) {
printf("Valor de a = %i\n", a);
a++;
sleep(3);
}
}
Brinque com ele! Compile, execute e fique enviando sinais 1 para ele:
$ ./sinais1
Meu pid eh 10719
Valor de a = 0
Valor de a = 1
Valor de a = 2
Valor de a = 0
No caso eu abri um novo terminal e nele digitei:
$ kill -1 10719
Foi o kill que fez o a voltar a ser 0 depois de ter sido 2! Tente você!
[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!