การประมวลผลสัญญาณ C ++
สัญญาณจะถูกส่งโดยระบบปฏิบัติการกระบวนการที่ถูกขัดจังหวะจะเลิกจ้างเริ่มต้นของโปรแกรม บน Unix, Linux, Mac OS X หรือระบบ Windows คุณสามารถกด CTRL + C ขัดจังหวะ
สัญญาณบางอย่างไม่สามารถจับขั้นตอน แต่ระบุไว้ในตารางด้านล่างสัญญาณที่สามารถบันทึกในโปรแกรมและสามารถดำเนินการที่เหมาะสมขึ้นอยู่กับสัญญาณ สัญญาณเหล่านี้จะกำหนดไว้ในไฟล์ส่วนหัว C ++ <csignal> ใน
信号 | 描述 |
---|---|
SIGABRT | 程序的异常终止,如调用abort。 |
SIGFPE | 错误的算术运算,比如除以零或导致溢出的操作。 |
SIGILL | 检测非法指令。 |
SIGINT | 接收到交互注意信号。 |
SIGSEGV | 非法访问内存。 |
SIGTERM | 发送到程序的终止请求。 |
สัญญาณ () ฟังก์ชัน
ไลบรารี c ++ให้ฟังก์ชั่นการประมวลผลสัญญาณสัญญาณในการจับภาพเหตุฉุกเฉินต่อไปนี้เป็นฟังก์ชั่นสัญญาณไวยากรณ์ ():
void (*signal (int sig, void (*func)(int)))(int);
ฟังก์ชั่นนี้ยอมรับสองพารามิเตอร์: พารามิเตอร์แรกเป็นจำนวนเต็มแทนจำนวนของสัญญาณนั้นพารามิเตอร์ที่สองคือตัวชี้ไปยังฟังก์ชั่นการประมวลผลสัญญาณ
ลองเขียนโปรแกรมง่ายๆ c ++ ที่ใช้สัญญาณ () ฟังก์ชั่นในการจับสัญญาณ SIGINTไม่ว่าสิ่งที่คุณต้องการที่จะจับสัญญาณในโปรแกรมของคุณคุณต้องใช้ฟังก์ชั่นของสัญญาณในการลงทะเบียนของสัญญาณและการประมวลผลสัญญาณที่เกี่ยวข้องกับโปรแกรมพิจารณาตัวอย่างต่อไปนี้:
#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "Interrupt signal (" << signum << ") received.\n"; // 清理并关闭 // 终止程序 exit(signum); } int main () { // 注册信号 SIGINT 和信号处理程序 signal(SIGINT, signalHandler); while(1){ cout << "Going to sleepthth" << endl; sleep(1); } return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
Going to sleepthth Going to sleepthth Going to sleepthth
ตอนนี้ให้กด Ctrl + C เพื่อหยุดโปรแกรมที่คุณจะเห็นการจับสัญญาณของโปรแกรมและออกจากโปรแกรมการพิมพ์ต่อไปนี้:
Going to sleepthth Going to sleepthth Going to sleepthth Interrupt signal (2) received.
เพิ่มฟังก์ชัน ()
คุณสามารถใช้การเพิ่มฟังก์ชั่น () สร้างสัญญาณฟังก์ชั่นสัญญาณจะใช้เวลาเป็นจำนวนเต็มเป็นพารามิเตอร์ไวยากรณ์ต่อไปนี้:
int raise (signal sig);
นี่ sig เป็นสัญญาณที่จะส่งหมายเลขสัญญาณเหล่านี้รวมถึง: SIGINT, SIGABRT, SIGFPE, SIGILL , SIGSEGV, SIGTERM, SIGHUPนี่คือสิ่งที่เราจะใช้เพิ่ม () ฟังก์ชันสร้างสัญญาณภายในเช่น A:
#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "Interrupt signal (" << signum << ") received.\n"; // 清理并关闭 // 终止程序 exit(signum); } int main () { int i = 0; // 注册信号 SIGINT 和信号处理程序 signal(SIGINT, signalHandler); while(++i){ cout << "Going to sleepthth" << endl; if( i == 3 ){ raise( SIGINT); } sleep(1); } return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปโดยอัตโนมัติและจะออกจาก:
Going to sleepthth Going to sleepthth Going to sleepthth Interrupt signal (2) received.