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

Menguasai Penanganan Sinyal C++: Pengelolaan Interupsi Aman dan Penutupan Program yang Bersih

Sinyal adalah interupsi yang dikirimkan oleh sistem operasi ke sebuah proses, yang dapat mengakhiri program secara tiba-tiba. 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, namun berikut adalah daftar sinyal yang dapat Anda tangkap dalam program dan tindakan yang sesuai dapat diambil berdasarkan sinyal tersebut. Sinyal-sinyal ini didefinisikan dalam berkas header C++ <csignal>.

Sr.No Sinyal & Deskripsi
1

SIGABRT

Pengakhiran program yang tidak normal, seperti pemanggilan ke abort.

2

SIGFPE

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

3

SIGILL

Deteksi instruksi ilegal.

4

SIGINT

Penerimaan sinyal perhatian interaktif.

5

SIGSEGV

Akses penyimpanan yang tidak valid.

6

SIGTERM

Permintaan pengakhiran yang dikirimkan ke program.

Fungsi signal()

Pustaka penanganan sinyal C++ menyediakan fungsi signal untuk menangkap peristiwa tidak terduga. Berikut adalah sintaks fungsi signal() −

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

Sederhananya, fungsi ini menerima dua argumen: argumen pertama adalah bilangan bulat yang mewakili nomor sinyal, dan argumen kedua adalah pointer ke fungsi penangan sinyal.

Buatlah program C++ sederhana tempat kita akan menangkap sinyal SIGINT menggunakan fungsi signal(). Sinyal apa pun yang ingin Anda tangkap dalam program, Anda harus mendaftarkan sinyal tersebut menggunakan fungsi signal dan menghubungkannya dengan penangan sinyal. Periksa 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, hasilnya adalah sebagai berikut −

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

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

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

Fungsi raise()

Anda dapat menghasilkan sinyal dengan fungsi raise(), yang menerima bilangan bulat nomor sinyal 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 memunculkan 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, hasilnya adalah sebagai berikut dan akan keluar secara otomatis −

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

Bahasa C

  1. Memahami Tipe Data C++: Dasar, Modifikasi, dan Praktik Terbaik
  2. Menguasai Operator C++: Panduan Lengkap dengan Contoh Praktis
  3. Komentar C++: Praktik Terbaik untuk Kode yang Mudah Dibaca dan Dipelihara
  4. Menguasai Template Kelas C++: Panduan Praktis
  5. Penanganan File C: Menguasai I/O dengan fopen, fprintf, fread, dan fseek
  6. Menguasai Penanganan Pengecualian C++: Contoh Praktis Try, Catch, Throw
  7. Menguasai Penanganan Kesalahan dalam C: Praktik Terbaik & Teknik
  8. Bahasa Pemrograman C++: Tinjauan & Fitur Utama
  9. Konstanta & Literal C++ Dijelaskan: Tipe, Sintaks, dan Praktik Terbaik
  10. Panduan Lengkap Operator C++: Tipe, Penggunaan, dan Praktik Terbaik