Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Bahasa C

Penanganan Sinyal C++

Sinyal adalah interupsi yang dikirimkan ke suatu proses oleh sistem operasi yang dapat menghentikan program sebelum waktunya. Anda dapat menghasilkan interupsi dengan menekan Ctrl+C pada sistem UNIX, LINUX, Mac OS X, atau Windows.

Ada sinyal yang tidak dapat ditangkap oleh program tetapi ada daftar sinyal berikut yang dapat Anda tangkap dalam program Anda dan dapat mengambil tindakan yang sesuai berdasarkan sinyal tersebut. Sinyal ini didefinisikan dalam file header C++ .

No.No Sinyal &Deskripsi
1

SIGABRT

Penghentian program yang tidak normal, seperti panggilan untuk dibatalkan .

2

SIGFPE

Operasi aritmatika yang salah, seperti pembagian dengan nol atau operasi yang menghasilkan overflow.

3

SIGILL

Deteksi instruksi ilegal.

4

MASUKKAN

Penerimaan sinyal perhatian interaktif.

5

SIGSEGV

Akses penyimpanan yang tidak valid.

6

SIGTERM

Permintaan penghentian dikirim ke program.

Fungsi signal()

Pustaka penanganan sinyal C++ menyediakan fungsi sinyal untuk menjebak kejadian tak terduga. Berikut adalah sintaks dari fungsi signal()

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

Sederhananya, fungsi ini menerima dua argumen:argumen pertama sebagai bilangan bulat yang mewakili nomor sinyal dan argumen kedua sebagai penunjuk ke fungsi penanganan sinyal.

Mari kita menulis program C++ sederhana di mana kita akan menangkap sinyal SIGINT menggunakan fungsi signal(). Sinyal apa pun yang ingin Anda tangkap dalam program Anda, Anda harus mendaftarkan sinyal tersebut menggunakan sinyal fungsi dan mengasosiasikannya dengan penangan sinyal. Perhatikan contoh berikut

#include <iostream>
#include <csignal>

using namespace std;

void signalHandler( int signum ) {
   cout << "Interrupt signal (" << signum << ") received.\n";

   // cleanup and close up stuff here  
   // terminate program  

   exit(signum);  
}

int main () {
   // register signal SIGINT and signal handler  
   signal(SIGINT, signalHandler);  

   while(1) {
      cout << "Going to sleep...." << endl;
      sleep(1);
   }

   return 0;
}

Ketika kode di atas dikompilasi dan dieksekusi, menghasilkan hasil sebagai berikut

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

Sekarang, tekan Ctrl+c untuk menghentikan program dan Anda akan melihat bahwa program Anda akan menangkap sinyal dan akan keluar dengan mencetak sesuatu sebagai berikut −

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

Fungsi kenaikan()

Anda dapat menghasilkan sinyal dengan fungsi raise() , yang mengambil nomor sinyal integer sebagai argumen dan memiliki sintaks berikut.

int raise (signal sig);

Di sini, sig adalah nomor sinyal untuk mengirim salah satu sinyal:SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP. Berikut adalah contoh di mana kita menaikkan sinyal secara internal menggunakan fungsi raise() sebagai berikut −

#include <iostream>
#include <csignal>

using namespace std;

void signalHandler( int signum ) {
   cout << "Interrupt signal (" << signum << ") received.\n";

   // cleanup and close up stuff here  
   // terminate program  

   exit(signum);  
}

int main () {
   int i = 0;
   // register signal SIGINT and signal handler  
   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 dieksekusi, menghasilkan hasil berikut dan akan keluar secara otomatis −

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

Bahasa C

  1. Tipe Data C++
  2. Operator C++
  3. Komentar C++
  4. Template Kelas C++
  5. C Penanganan Berkas
  6. Penanganan Pengecualian C++:Coba, Tangkap, lempar Contoh
  7. C - Penanganan Kesalahan
  8. Ikhtisar C++
  9. Konstanta/Literal C++
  10. Operator di C++