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.