Latest web development tutorials

Przetwarzanie sygnału C ++

Sygnał przekazywany jest przez system operacyjny, proces zostanie przerwany, będzie wcześniejsze zakończenie programu. W systemie UNIX, Linux, Mac OS X lub systemach Windows, można nacisnąć kombinację klawiszy Ctrl + C przerwanie.

Niektóre sygnały nie mogą być łowione procedury, ale w tabeli poniżej sygnału mogą być ujęte w programie i może podjąć odpowiednie działania w oparciu o sygnał. Sygnały te są zdefiniowane w C ++ pliku nagłówkowym <csignal> w.

信号 描述
SIGABRT 程序的异常终止,如调用abort
SIGFPE 错误的算术运算,比如除以零或导致溢出的操作。
SIGILL 检测非法指令。
SIGINT 接收到交互注意信号。
SIGSEGV 非法访问内存。
SIGTERM 发送到程序的终止请求。

Sygnał function ()

biblioteka C ++ dostarczasygnału funkcji przetwarzania sygnału, aby uchwycić się ratownictwem.Poniżej znajduje się funkcja sygnału składni ():

void (*signal (int sig, void (*func)(int)))(int); 

Funkcja ta przyjmuje dwa parametry: pierwszy parametr jest liczbą całkowitą reprezentującą liczbę sygnał, drugi parametr jest wskaźnikiem do funkcji przetwarzania sygnału.

Załóżmy napisać prosty program w C ++, który używa funkcji signal (), aby przechwycić sygnał SIGINT. Bez względu na to, co chcesz, aby uchwycić sygnał w swoim programie, należy użyć funkcjisygnału do rejestracji sygnału i przetwarzania sygnału związanego z programem.Rozważmy następujące przykłady:

#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;
}

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

Going to sleep....
Going to sleep....
Going to sleep....

Teraz naciśnij Ctrl + C, aby przerwać program, zobaczysz przechwytywanie sygnału programu i zamknąć program do drukowania, co następuje:

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

podniesienia function ()

Można użyćpodbicie funkcyjny ()generuje sygnał, funkcja sygnału zajmuje całkowitą liczbę jako parametr, o następującej składni:

int raise (signal sig);

Tutaj porządek jest sygnał do przesyłania numerów Sygnały te obejmują: SIGINT, SIGABRT, SIGFPE, SIGILL , SIGSEGV, SIGTERM, SIGHUP.Oto co używamy raise () funkcja ta generuje sygnał w instancji:

#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;
}

Jeżeli powyższy kod jest kompilowany i wykonywany, to daje następujące wyniki i automatycznie wyjść:

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.