Sinais em Linux

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.

[ Hits: 185.284 ]

Por: Elgio Schlemer em 20/05/2008 | Blog: https://profelgio.duckdns.org/~elgio


Sinais mais importantes



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?

Página anterior     Próxima página

Páginas do artigo
   1. Comunicações entre processos
   2. Sinais
   3. Sinais mais importantes
   4. Quando kill não é kill
   5. A chamada de sistema signal
   6. Construindo um "HighLander"
   7. E o tal do SIGALRM?
   8. Conclusão
Outros artigos deste autor

A mágica do dc

Criptografia assimétrica com o RSA

Cuidado com números em Ponto Flutuante

Introdução a criptografia

Estrutura do Iptables

Leitura recomendada

Utilizando técnicas recursivas em C e C++

Tutorial OpenGL v3.0

GNA: um Coprocessador para Aceleração Neural

Compilando Templates C++

Compilando o Mono 2.2 no Ubuntu 8.10

  
Comentários
[1] Comentário enviado por elgio em 20/05/2008 - 11:43h

Códigos fontes dos exemplos em C para download neste link:

http://gravatai.ulbra.tche.br/~elgio/disciplinas/?MAT=VOL&DISC=OUTRAS

Estou melhorando os comentários dos mesmos.

[2] Comentário enviado por stremer em 20/05/2008 - 12:17h

Elgio.
Só posso falar uma coisa do seu artigo!
Fantastico, como sempre!

[3] Comentário enviado por itocamargo em 20/05/2008 - 13:26h

Muito bom o seu artigo...
parabéns...

[4] Comentário enviado por f_Candido em 20/05/2008 - 14:51h

Somente duas palavras:
Muito bom.

Parabéns

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

[7] Comentário enviado por elgio em 20/05/2008 - 15:53h

Alias, olha que interessante!

Com o morroNao em uma janela, redimensione ela (a janela).
Veras que o morroNao recebe o sinal 28!

[8] Comentário enviado por rafasmart em 20/05/2008 - 16:06h

será que tem alguma coisa a ver com a minha plataforma?
Ubuntu Gutsy - 64 bits (x86_64)?

[9] Comentário enviado por rafasmart em 20/05/2008 - 16:29h

compilando com a opção p/ i386 ele não morre (exceto pelo sinal 9):

gcc -m386 -o morronao morronao.c

e antes eu estava compilando com as opções
-Wall -ansi -pedantic

[10] Comentário enviado por elgio em 20/05/2008 - 16:39h

Muito estranho!
Seria um BUG?

Testa se isto resolve:
void morroNao(int sinal)
{
signal(sinal, morroNao);

printf("\n\n*** O seu MANE, eu sou imortal ***\n");
printf("*** Nao eh por causa do sinalzinho %i que vou perecer!!\n\n",
sinal);
}

Agora ao chamar a morroNao a mesma se auto redefine.

[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)

[12] Comentário enviado por rodrigoleme em 20/05/2008 - 19:49h

muito bom!
parabéns!

[13] Comentário enviado por monsores em 20/05/2008 - 21:51h

Artigo excelente!!!
Para mim o 'kill' era apenas um assassino. :-)

[14] Comentário enviado por iagoaugusto em 21/05/2008 - 18:09h

huhuahauahauahaua bom artigo....

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

[16] Comentário enviado por marcosmiras em 23/05/2008 - 10:16h

Meu...
Excelente!

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

abraço e até mais.

[19] Comentário enviado por maiconkist em 12/07/2009 - 20:01h

Bastante esclarecedor.


Parabéns.

[20] Comentário enviado por removido em 29/07/2009 - 22:35h

Manda o sinal 35 pro morroNao que ele morre sim ^^

[21] Comentário enviado por elgio em 29/07/2009 - 22:42h

Sim, sinais de tempo real também são do tipo não mascaráveis, assim como o 9.

[22] Comentário enviado por julio_hoffimann em 12/01/2010 - 10:42h

Elgio Schlemer,

Simplesmesnte esclarecedor!!!!
Poupou horas de estudo para um bom entendimento, agora tenho base para ir mais a fundo nesses conceitos. Obrigado!

Parabéns!!

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

[24] Comentário enviado por tortugo em 26/04/2011 - 22:25h

Elgio,

excelente artigo! Vou colocar um link no meu blog http://johntortugo.wordpress.com/


JT


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts