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

Recebe: uma variável inteira que indica qual dos sinais deve ser tratado adiante e qual o tratamento deve ser dado quando o programa enviar/receber um sinal do tipo informado.

Retorna: void, função sem retorno (retorna o tratador de sinal anterior ou SIG_ERR em caso de erro).

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

Recebe: um valor inteiro, que representa um dos sinais presentes no cabeçalho signal.h.

Retorna: 0, em caso de sucesso da execução da função, ou um valor diferente de zero, caso contrário.

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