Computer >> Máy Tính >  >> Lập trình >> C ++

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

Tín hiệu là các ngắt do 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 về 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 xác định trong tệp tiêu đề C ++

Tín hiệu
Mô tả
SIGABRT
Chấm dứt chương trình bất thường, chẳng hạn như lời kêu gọi hủy bỏ .
SIGFPE
Một phép toán số học sai, chẳng hạn như phép chia cho 0 hoặc một phép toán dẫn đến tràn.
SIGILL
Phát hiện một chỉ dẫn bất hợp pháp.
SIGINT
Nhận tín hiệu chú ý tương tác.
SIGSEGV
Quyền truy cập không hợp lệ vào bộ nhớ.
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 tín hiệu hàm để bẫy các sự kiện không mong muốn. 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 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ằng chức năng tín hiệu và kết hợp nó với bộ xử lý tín hiệu. Kiểm tra ví dụ sau -

Ví dụ

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

Đầu ra

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

Sau khi nhấn Ctrl + C, nó sẽ hiển thị,

Đầu ra

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 bằng hàm raise (), lấy một số nguyên tín hiệu làm đối số và có cú pháp sau.

int raise (signal sig);

Ở đây, sig là 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ụ mà chúng tôi tăng tín hiệu nội bộ bằng cách sử dụng hàm raise () như sau -

Ví dụ

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

Đầu ra

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