<signal.h>
No cabeçalho <signal.h> estão presentes funções e macros que lidam com os sinais recebidos e enviados pelo programa no momento em que ele está sendo executado. Isso ocorre, por exemplo, quando o programa é finalizado de forma anormal ou quando algum tipo de operação aritmética apresenta erros, como a tentativa de divisão por zero.
Macros
- SIG_DFL: Indica o tratamento padrão fornecido pelo sistema para o envio de algum sinal pelo programa em execução.
- SIG_IGN: Indica que o tratamento fornecido para um tipo de sinal será ignorá-lo.
- SIG_ERR: Sinal padrão para o tratamento de sinais que indicam erro.
- SIGABRT: Programa finalizado de forma anormal, com execução inesperada.
- SIGFPE: Erro em operações de aritmética, como operações aritméticas proibidas ou tentativa de operar com valores que extrapolam os limites de um determinado tipo.
- SIGILL: Instrução não permitida.
- SIGINT: Interrupção de execução do programa, como quando o usuário forçadamente cancela a execução (ex: Ctrl+C).
- SIGSEGV: Erro de acesso de memória, seja por tentar acessar uma posição de memória não permitida ou por tentativa de uso de memória sem que exista mais espaço.
- SIGTERM: Requisição de finalização do programa.
Funções
void (*signal(int sinal, void (*tratamento)(int)))(int)
Define como o programa deve reagir a um sinal específico recebido durante sua execução.
Exemplo
// EXEMPLO SIGNAL()
#include <stdio.h>
#include <signal.h>
int main() {
// Ignora a tentativa de finalização (SIGTERM)
signal(SIGTERM, SIG_IGN);
// Envia o sinal para finalizar
raise(SIGTERM);
printf("O programa não terminou a execução ainda!\n");
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
O programa não terminou a execução ainda!
int raise(int sig)
Gera artificialmente um sinal para o programa atual, forçando o comportamento correspondente àquele sinal (ou o
comportamento definido pelo signal()).
Exemplo
// EXEMPLO RAISE()
#include <stdio.h>
#include <signal.h>
int main() {
printf("O programa terá sua execução interrompida!\n");
// Envia um pedido de terminação do programa
raise(SIGTERM);
// Esta linha não será executada, pois o programa encerrará acima
printf("Eu avisei...\n");
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
O programa terá sua execução interrompida!
Terminated