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.
Parte 6: Construindo um "HighLander"
Filme clássico onde existem imortais que lutam entre si No caso não é uma luta, mas sim um programa chato que resiste a tudo (ou quase tudo).
Neste programa todos os sinais que podem ser tratados foram desviados para a função morroNao que ainda por cima é mal educada, rindo da cara de quem a tentou matar. Segue o código do que chamei de morroNao.c:
Compilando este código e executando, percebe-se que o infeliz é chato. Tente derrubar ele com control+C, tenta colocar ele em segundo plano com Control+Z, vai em um console e envia os mais diversos sinais para ele: 1, 2, 3, 4, 14, 15, 20... NADA! Que programa chato.
Mas claro que SEMPRE o tiro na testa funciona:
$ kill -9
Pois um programa não tem como desviar o tratamento do -9 (SIGKILL).
Neste programa todos os sinais que podem ser tratados foram desviados para a função morroNao que ainda por cima é mal educada, rindo da cara de quem a tentou matar. Segue o código do que chamei de morroNao.c:
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
void morroNao(int sinal)
{
printf("\n\n***** O seu MANE, eu sou imortal *****\n");
printf("***** Nao eh por causa do sinalzinho %i que vou perecer!!\n\n", sinal);
}
int main()
{
char c;
int s;
for (s=1; s<35; s++){
signal(s, morroNao);
}
while (1) {
printf("qua qua qua. Ainda to vivo. Meu pid eh %i\n", getpid());
sleep(3);
}
return 0;
}
#include <unistd.h>
#include <stdio.h>
void morroNao(int sinal)
{
printf("\n\n***** O seu MANE, eu sou imortal *****\n");
printf("***** Nao eh por causa do sinalzinho %i que vou perecer!!\n\n", sinal);
}
int main()
{
char c;
int s;
for (s=1; s<35; s++){
signal(s, morroNao);
}
while (1) {
printf("qua qua qua. Ainda to vivo. Meu pid eh %i\n", getpid());
sleep(3);
}
return 0;
}
Compilando este código e executando, percebe-se que o infeliz é chato. Tente derrubar ele com control+C, tenta colocar ele em segundo plano com Control+Z, vai em um console e envia os mais diversos sinais para ele: 1, 2, 3, 4, 14, 15, 20... NADA! Que programa chato.
Mas claro que SEMPRE o tiro na testa funciona:
$ kill -9
Pois um programa não tem como desviar o tratamento do -9 (SIGKILL).
http://gravatai.ulbra.tche.br/~elgio/disciplinas/?MAT=VOL&DISC=OUTRAS
Estou melhorando os comentários dos mesmos.