Xử lý tín hiệu C ++

Tín hiệu là các ngắt được hệ điều hành gửi đến một quá trình có thể kết thúc sớm một chương trình. Bạn có thể tạo ngắt bằng cách nhấn Ctrl + C trên hệ thống UNIX, LINUX, Mac OS X hoặc Windows.

Có những tín hiệu mà chương trình không thể bắt được nhưng có một danh sách sau đây các tín hiệu mà bạn có thể bắt được trong chương trình của mình và có thể thực hiện các hành động thích hợp dựa trên tín hiệu đó. Các tín hiệu này được định nghĩa trong tệp tiêu đề C ++ <csignal>.

Sr.No Tín hiệu & Mô tả
1

SIGABRT

Chấm dứt chương trình bất thường, chẳng hạn như cuộc gọi đến abort.

2

SIGFPE

Một phép toán số học sai, chẳng hạn như phép chia cho không hoặc một phép toán dẫn đến tràn.

3

SIGILL

Phát hiện một chỉ dẫn bất hợp pháp.

4

SIGINT

Nhận tín hiệu chú ý tương tác.

5

SIGSEGV

Quyền truy cập không hợp lệ vào bộ nhớ.

6

SIGTERM

Một yêu cầu chấm dứt được gửi đến chương trình.

Hàm signal ()

Thư viện xử lý tín hiệu C ++ cung cấp chức năng signalđể bẫy các sự kiện bất ngờ. Sau đây là cú pháp của hàm signal ():

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

Nói một cách đơn giản, hàm này nhận được hai đối số: đối số đầu tiên là một số nguyên đại diện cho số tín hiệu và đối số thứ hai là một con trỏ đến hàm xử lý tín hiệu.

Hãy để chúng tôi viết một chương trình C ++ đơn giản, nơi chúng tôi sẽ bắt tín hiệu SIGINT bằng cách sử dụng hàm signal (). Bất kỳ tín hiệu nào bạn muốn bắt trong chương trình của mình, bạn phải đăng ký tín hiệu đó bằngsignalvà kết hợp nó với một trình xử lý tín hiệu. Kiểm tra ví dụ sau -

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

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

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

Bây giờ, nhấn Ctrl + c để ngắt chương trình và bạn sẽ thấy rằng chương trình của bạn sẽ bắt được tín hiệu và sẽ xuất hiện bằng cách in một cái gì đó như sau:

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

Hàm raise ()

Bạn có thể tạo tín hiệu theo chức năng raise(), lấy một số tín hiệu nguyên làm đối số và có cú pháp sau.

int raise (signal sig);

Đây, siglà số tín hiệu để gửi bất kỳ tín hiệu nào: SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP. Dưới đây là ví dụ trong đó chúng tôi nâng tín hiệu nội bộ bằng cách sử dụng hàm raise () như sau:

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

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau và sẽ tự động xuất hiện:

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