Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Linguagem C

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

  1. Tipos de dados C++
  2. Operadores C++
  3. Comentários C++
  4. Modelos de classe C++
  5. C Manipulação de Arquivos
  6. Manipulação de Exceções C++:Try, Catch, Throw Exemplo
  7. C - Tratamento de erros
  8. Visão geral do C++
  9. Constantes/literais C++
  10. Operadores em C++