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 7: E o tal do SIGALRM?
Este sinal eu acho muito legal. Não o sinal em si (que é o 14), mas sim o seu poder em uso com a chamada de função alarm (man 2 alarm).
Com a chamada de função alarm eu posso agendar um envio do sinal 14 para meu próprio processo. Como colocar um relógio para despertar.
Sempre um exemplo é melhor que uma longa explicação, certo?
Pense, caro amigo programador, como isto lhe pode ser deveras útil em seus programas do dia a dia.
Com a chamada de função alarm eu posso agendar um envio do sinal 14 para meu próprio processo. Como colocar um relógio para despertar.
Sempre um exemplo é melhor que uma longa explicação, certo?
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void trata2(int sinal)
{
printf("Tu nao eh um bom usuario. Cansei de esperar!\n");
raise(15);
/* a funcao raise envia um sinal para eu mesmo. No caso estou enviando o sinal 15, que como não foi tratado encerra o programa.
raise (sinal) é um alias praticamente para kill(getpid(), sinal). Inclusive o man dele diz isto (man raise)
*/
}
void trata1(int sinal)
{
printf("Ta, vou esperar a vida toda? Tem mais 3 segundos!\n");
/* Redefine o sinal SIGALRM para outra funcao */
signal(SIGALRM, trata2);
alarm(3); // agenda 3 segundos
}
int main()
{
int a;
signal(SIGALRM, trata1);
printf("Meu pid eh %i\n", getpid());
alarm(5); // agenda 5 segundos para disparar o sinal SIGALRM
printf("Digite um numero: \n");
scanf("%i", &a);
alarm(0); // cancela agendamento
printf("Obrigado.\n");
return(0);
}
#include <signal.h>
#include <unistd.h>
void trata2(int sinal)
{
printf("Tu nao eh um bom usuario. Cansei de esperar!\n");
raise(15);
/* a funcao raise envia um sinal para eu mesmo. No caso estou enviando o sinal 15, que como não foi tratado encerra o programa.
raise (sinal) é um alias praticamente para kill(getpid(), sinal). Inclusive o man dele diz isto (man raise)
*/
}
void trata1(int sinal)
{
printf("Ta, vou esperar a vida toda? Tem mais 3 segundos!\n");
/* Redefine o sinal SIGALRM para outra funcao */
signal(SIGALRM, trata2);
alarm(3); // agenda 3 segundos
}
int main()
{
int a;
signal(SIGALRM, trata1);
printf("Meu pid eh %i\n", getpid());
alarm(5); // agenda 5 segundos para disparar o sinal SIGALRM
printf("Digite um numero: \n");
scanf("%i", &a);
alarm(0); // cancela agendamento
printf("Obrigado.\n");
return(0);
}
Pense, caro amigo programador, como isto lhe pode ser deveras útil em seus programas do dia a dia.
http://gravatai.ulbra.tche.br/~elgio/disciplinas/?MAT=VOL&DISC=OUTRAS
Estou melhorando os comentários dos mesmos.