processamento de sinal C ++
O sinal é transmitido pelo sistema operativo, o processo é interrompido, vai terminação precoce de um programa. No UNIX, Linux, Mac OS X ou sistemas Windows, você pode pressionar Ctrl + C interrupção.
Alguns sinais não pode ser apanhado procedimentos, mas listados na tabela abaixo, o sinal pode ser capturado no programa, e pode tomar as medidas adequadas com base no sinal. Estes sinais são definidos no C ++ arquivo de cabeçalho <csignal> in.
信号 | 描述 |
---|---|
SIGABRT | 程序的异常终止,如调用abort。 |
SIGFPE | 错误的算术运算,比如除以零或导致溢出的操作。 |
SIGILL | 检测非法指令。 |
SIGINT | 接收到交互注意信号。 |
SIGSEGV | 非法访问内存。 |
SIGTERM | 发送到程序的终止请求。 |
função de sinal ()
biblioteca C ++ fornece a função de processamento de sinalde sinal para capturar emergências.O que se segue é a função de sinal de sintaxe ():
void (*signal (int sig, void (*func)(int)))(int);
Esta função aceita dois parâmetros: o primeiro parâmetro é um número inteiro que representa o número de um sinal, o segundo parâmetro é um ponteiro para uma função de processamento de sinal.
Vamos escrever um programa simples C ++ que usa a função signal () para capturar sinal SIGINT. Não importa o que você deseja capturar o sinal em seu programa, você deve usar a função desinal para registrar o sinal eo processamento de sinal associado com o programa.Considere os seguintes exemplos:
#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "Interrupt signal (" << signum << ") received.\n"; // 清理并关闭 // 终止程序 exit(signum); } int main () { // 注册信号 SIGINT 和信号处理程序 signal(SIGINT, signalHandler); while(1){ cout << "Going to sleep...." << endl; sleep(1); } return 0; }
Quando o código acima é compilado e executado, ele produz os seguintes resultados:
Going to sleep.... Going to sleep.... Going to sleep....
Agora, pressione Ctrl + C para interromper o programa, você verá a captura de sinal de programa, e sair do programa para imprimir o seguinte:
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.
levantar function ()
Você pode usar oaumento function ()gera um sinal, a função de sinal leva um número inteiro como um parâmetro, a seguinte sintaxe:
int raise (signal sig);
Aqui, sig é o sinal a ser transmitido números Esses sinais incluem: SIGINT, SIGABRT, SIGFPE, SIGILL , SIGSEGV, SIGTERM, SIGHUP.Aqui está o que nós usamos o raise () função gera um sinal dentro de uma instância:
#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "Interrupt signal (" << signum << ") received.\n"; // 清理并关闭 // 终止程序 exit(signum); } int main () { int i = 0; // 注册信号 SIGINT 和信号处理程序 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 os seguintes resultados, e sairá automaticamente:
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.