Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การจัดการสัญญาณใน C++


สัญญาณเป็นการขัดจังหวะที่ส่งไปยังกระบวนการโดยระบบปฏิบัติการซึ่งสามารถยุติโปรแกรมก่อนเวลาอันควร คุณสามารถสร้างอินเตอร์รัปต์ได้โดยกด Ctrl+C บนระบบ UNIX, LINUX, Mac OS X หรือ Windows

มีสัญญาณที่โปรแกรมจับไม่ได้ แต่มีรายการสัญญาณต่อไปนี้ซึ่งคุณสามารถจับได้ในโปรแกรมของคุณ และสามารถดำเนินการตามความเหมาะสมตามสัญญาณได้ สัญญาณเหล่านี้ถูกกำหนดไว้ในไฟล์ส่วนหัว C++

สัญญาณ
คำอธิบาย
SIGABRT
การสิ้นสุดโปรแกรมอย่างผิดปกติ เช่น การเรียก ยกเลิก .
SIGFPE
การดำเนินการทางคณิตศาสตร์ที่ผิดพลาด เช่น การหารด้วยศูนย์หรือการดำเนินการที่ทำให้เกิดการล้น
SIGILL
การตรวจจับคำสั่งที่ผิดกฎหมาย
SIGINT
การรับสัญญาณความสนใจแบบโต้ตอบ
SIGSEGV
การเข้าถึงที่เก็บข้อมูลไม่ถูกต้อง
SIGTERM
ส่งคำขอยกเลิกไปยังโปรแกรม

ฟังก์ชันสัญญาณ ()

ไลบรารีการจัดการสัญญาณ C++ จัดเตรียมสัญญาณฟังก์ชันเพื่อดักจับเหตุการณ์ที่ไม่คาดคิด ต่อไปนี้เป็นไวยากรณ์ของฟังก์ชัน signal() -

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

เพื่อให้ง่าย ฟังก์ชันนี้ได้รับสองอาร์กิวเมนต์:อาร์กิวเมนต์แรกเป็นจำนวนเต็มซึ่งแสดงหมายเลขสัญญาณและอาร์กิวเมนต์ที่สองเป็นตัวชี้ไปยังฟังก์ชันการจัดการสัญญาณ

ให้เราเขียนโปรแกรม C ++ อย่างง่ายที่เราจะจับสัญญาณ SIGINT โดยใช้ฟังก์ชัน signal() ไม่ว่าสัญญาณใดที่คุณต้องการจับในโปรแกรมของคุณ คุณต้องลงทะเบียนสัญญาณนั้นโดยใช้ฟังก์ชันสัญญาณและเชื่อมโยงกับตัวจัดการสัญญาณ ตรวจสอบตัวอย่างต่อไปนี้ −

ตัวอย่าง

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

ผลลัพธ์

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

หลังจากกด Ctrl + C มันจะแสดง

ผลลัพธ์

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

ฟังก์ชันยก ()

คุณสามารถสร้างสัญญาณโดยฟังก์ชัน ยก() ซึ่งใช้หมายเลขสัญญาณจำนวนเต็มเป็นอาร์กิวเมนต์ และมีรูปแบบดังนี้

int raise (signal sig);

ที่นี่ sig คือหมายเลขสัญญาณเพื่อส่งสัญญาณใดๆ:SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP ต่อไปนี้คือตัวอย่างที่เราเพิ่มสัญญาณภายในโดยใช้ฟังก์ชันการยก () ดังนี้ −

ตัวอย่าง

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

ผลลัพธ์

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