Latest web development tutorials

C ++ pemrosesan sinyal

Sinyal dilewatkan oleh sistem operasi, proses ini terganggu, akan terminasi dini dari sebuah program. Pada UNIX, LINUX, Mac OS X atau sistem Windows, Anda dapat menekan Ctrl + C interupsi.

Beberapa sinyal tidak dapat ditangkap prosedur, tetapi tercantum dalam tabel di bawah sinyal dapat ditangkap dalam program ini, dan dapat mengambil tindakan yang sesuai berdasarkan sinyal. Sinyal-sinyal ini didefinisikan dalam C ++ file header <csignal> di.

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

sinyal () function

C ++ library memberikansinyal fungsi pemrosesan sinyal untuk menangkap keadaan darurat.Berikut ini adalah fungsi sinyal sintaks ():

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

Fungsi ini menerima dua parameter: parameter pertama adalah bilangan bulat yang mewakili jumlah sinyal; Parameter kedua adalah pointer ke fungsi pemrosesan sinyal.

Mari kita menulis C ++ program sederhana yang menggunakan fungsi sinyal () untuk menangkap sinyal SIGINT. Tidak peduli apa yang Anda ingin menangkap sinyal dalam program Anda, Anda harus menggunakan fungsisinyal untuk mendaftarkan sinyal, dan pemrosesan sinyal yang terkait dengan program.Perhatikan contoh berikut:

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

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

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

Sekarang, tekan Ctrl + C untuk menghentikan program ini, Anda akan melihat penangkapan sinyal Program, dan keluar dari program untuk mencetak berikut:

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

meningkatkan () function

Anda dapat menggunakan fungsikenaikan gaji () menghasilkan sinyal, fungsi sinyal mengambil nomor integer sebagai parameter, sintaks berikut:

int raise (signal sig);

Di sini, sig adalah sinyal yang akan ditransmisikan nomor sinyal ini meliputi: SIGINT, SIGABRT, SIGFPE, SIGILL , SIGSEGV, SIGTERM, SIGHUP.Inilah yang kita gunakan kenaikan () fungsi menghasilkan sinyal dalam sebuah contoh:

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

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut, dan secara otomatis akan keluar:

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