Manipulação de sinal C++
Sinais são as interrupções entregues a um processo pelo sistema operacional que podem encerrar um programa prematuramente. Você pode gerar interrupções pressionando Ctrl+C em um sistema UNIX, LINUX, Mac OS X ou Windows.
Existem sinais que não podem ser capturados pelo programa, mas há uma lista a seguir de sinais que você pode capturar em seu programa e pode tomar as ações apropriadas com base no sinal. Esses sinais são definidos no arquivo de cabeçalho C++
Sr.Nº | Sinal e Descrição |
---|---|
1 | SIGABRT Encerramento anormal do programa, como uma chamada para anular . |
2 | SIGFPE Uma operação aritmética errônea, como uma divisão por zero ou uma operação que resulta em estouro. |
3 | SIGILO Detecção de uma instrução ilegal. |
4 | SIGINT Recebimento de um sinal de atenção interativo. |
5 | SIGSEGV Um acesso inválido ao armazenamento. |
6 | SIGTERM Uma solicitação de encerramento enviada ao programa. |
A função signal()
A biblioteca de tratamento de sinais C++ fornece a função sinal para capturar eventos inesperados. A seguir está a sintaxe da função signal() −
void (*signal (int sig, void (*func)(int)))(int);
Mantendo-o simples, esta função recebe dois argumentos:primeiro argumento como um número inteiro que representa o número do sinal e segundo argumento como um ponteiro para a função de manipulação de sinal.
Vamos escrever um programa simples em C++ onde pegaremos o sinal SIGINT usando a função signal(). Seja qual for o sinal que você deseja capturar em seu programa, você deve registrar esse sinal usando sinal função e associá-lo a um manipulador de sinal. Examine o seguinte exemplo -
#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "Interrupt signal (" << signum << ") received.\n"; // cleanup and close up stuff here // terminate program exit(signum); } int main () { // register signal SIGINT and signal handler signal(SIGINT, signalHandler); while(1) { cout << "Going to sleep...." << endl; sleep(1); } return 0; }
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Going to sleep.... Going to sleep.... Going to sleep....
Agora, pressione Ctrl + c para interromper o programa e você verá que seu programa pegará o sinal e sairá imprimindo algo da seguinte forma -
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.
A função raise()
Você pode gerar sinais pela função raise() , que recebe um número de sinal inteiro como argumento e tem a seguinte sintaxe.
int raise (signal sig);
Aqui, assina é o número do sinal para enviar qualquer um dos sinais:SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP. A seguir está o exemplo em que levantamos um sinal internamente usando a função raise() da seguinte forma −
#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "Interrupt signal (" << signum << ") received.\n"; // cleanup and close up stuff here // terminate program exit(signum); } int main () { int i = 0; // register signal SIGINT and signal handler signal(SIGINT, signalHandler); while(++i) { cout << "Going to sleep...." << endl; if( i == 3 ) { raise( SIGINT); } sleep(1); } return 0; }
Quando o código acima é compilado e executado, ele produz o seguinte resultado e sairia automaticamente -
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.
Linguagem C