Latest web development tutorials

Le traitement du signal C

Le signal est transmis par le système d'exploitation, le processus est interrompu, sera la résiliation anticipée d'un programme. Sous UNIX, LINUX, Mac OS X ou Windows, vous pouvez appuyer sur Ctrl + C interruption.

Certains signaux ne peuvent pas être pris de procédures, mais énumérées dans le tableau ci-dessous le signal peut être capturé dans le programme, et peuvent prendre des mesures appropriées en fonction du signal. Ces signaux sont définis dans le fichier d'en-tête de la C <csignal> dans.

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

fonction signal ()

La bibliothèque C fournit lesignal de fonction de traitement du signal pour capturer les situations d' urgence.Ce qui suit est la fonction signal de syntaxe ():

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

Cette fonction accepte deux paramètres: le premier paramètre est un nombre entier représentant le nombre d'un signal, le deuxième paramètre est un pointeur vers une fonction de traitement de signal.

Écrivons un programme simple de C ++ qui utilise la fonction signal () pour capturer le signal SIGINT. Peu importe ce que vous voulez capturer le signal dans votre programme, vous devez utiliser la fonctionde signal pour enregistrer le signal et le traitement du signal associé au programme.Prenons les exemples suivants:

#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 les résultats suivants:

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

Maintenant, appuyez sur Ctrl + C pour interrompre le programme, vous verrez la capture de signal de programme, et quittez le programme d'imprimer ce qui suit:

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

augmenter la fonction ()

Vous pouvez utiliser la fonctionraise () génère un signal, la fonction du signal est un nombre entier en tant que paramètre, la syntaxe suivante:

int raise (signal sig);

Ici, sig est le signal aux numéros Ces signaux comprennent être transmis: SIGINT, SIGABRT, SIGFPE, SIGILL , SIGSEGV, SIGTERM, SIGHUP.Voici ce que nous utilisons l'augmentation () génère un signal dans une instance:

#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 produit les résultats suivants, et sortira automatiquement:

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