สัญญาณเป็นการขัดจังหวะที่ส่งไปยังกระบวนการโดยระบบปฏิบัติการซึ่งสามารถยุติโปรแกรมก่อนเวลาอันควร คุณสามารถสร้างอินเตอร์รัปต์ได้โดยกด 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.