Traitement du signal C++
Un signal est une interruption envoyée à un processus par le système d'exploitation, qui mettra fin prématurément à un programme. Sur les systèmes UNIX, LINUX, Mac OS X ou Windows, vous pouvez générer une interruption en appuyant sur Ctrl+C.
Certains signaux ne peuvent pas être captés par le programme, mais les signaux répertoriés dans le tableau suivant peuvent être captés par le programme et des actions appropriées peuvent être prises en fonction de ces signaux. Ces signaux sont définis dans le fichier d'en-tête C++ <csignal>.
信号 | 描述 |
---|---|
SIGABRT | 程序的异常终止,如调用 abort。 |
SIGFPE | 错误的算术运算,比如除以零或导致溢出的操作。 |
SIGILL | 检测非法指令。 |
SIGINT | 接收到交互注意信号。 |
SIGSEGV | 非法访问内存。 |
SIGTERM | 发送到程序的终止请求。 |
Fonction signal()
La bibliothèque de traitement du signal C++ fournit la fonction signal pour capturer des événements inattendus. Voici la syntaxe de la fonction signal() :
void (*signal (int sig, void (*func)(int)))(int);
Cette fonction reçoit deux paramètres : le premier paramètre est un entier, représentant le numéro du signal ; le deuxième paramètre est un pointeur vers la fonction de traitement du signal ; .
Écrivons un programme C++ simple pour capturer le signal SIGINT à l'aide de la fonction signal(). Quel que soit le signal que vous souhaitez capturer dans votre programme, vous devez utiliser la fonction signal pour enregistrer le signal et l'associer à un gestionnaire de signal. Jetez un œil à l'exemple suivant :
#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; }
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :
Going to sleep.... Going to sleep.... Going to sleep....
Maintenant, appuyez sur Ctrl+C pour interrompre le programme et vous voir Le programme capte le signal et le programme imprime ce qui suit et se termine :
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.
fonction raise()
Vous pouvez générer un signal en utilisant la fonction raise() qui prend un entier Le numéro du signal est utilisé comme paramètre, et la syntaxe est la suivante :
int raise (signal sig);
Ici, sig est le numéro du signal à envoyer. Ces signaux incluent : SIGINT. , SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP . Voici un exemple où nous utilisons la fonction raise() pour générer un signal en interne :
#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; }
Lorsque le code ci-dessus est compilé et exécuté, il produira les résultats suivants et se fermera automatiquement :
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.