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