这里记录一下C++信号处理函数的使用。C++信号处理函数可以捕获外界终端信号,并进入中断处理函数。
需要使用到的头文件:
#include <csignal>
信号中断初始化函数:
signal(SIGINT, signalHandler);
signal为信号中断初始化函数,第一个参数是中断信号源,第二个函数是中断函数。
其中中断信号源有以下几种:
SIGINT:中断信号,通常由终端按下 Ctrl+C 触发。
SIGTERM:终止信号,通常用于请求程序正常退出。
SIGQUIT:停止信号,通常由终端按下 Ctrl+\ 触发。
SIGKILL:强制终止信号,无法被捕获、阻塞或忽略,用于立即终止进程。
SIGSTOP:停止信号,无法被捕获、阻塞或忽略,用于暂停进程的执行。
示例:
下面写一个C++示例,实现在while循环中,按下Ctrl+C退出循环,按下Ctrl+\暂停循环,按下回车键,继续循环。
#include <csignal>
#include <iostream>
int gotSignal = 0;
/*
description:信号处理函数
function:按下Ctrl+C ,退出播包, 按下Ctrl+\,停止播包,按下回车,继续播包
parameter:中断信号为SIGINT时,signum = 2;中断信号为SIGQUIT时,signum = 3。
*/
void signalHandler(int signum) {
std::cout << "Interrupt signal (" << signum << ") received.\n";
if(signum == 2)
gotSignal = 2;
if(signum == 3)
gotSignal = 3;
// exit(signum);
}
int main()
{
//初始化信号处理函数
std::signal(SIGINT, signalHandler);
std::signal(SIGQUIT, signalHandler);
while(1)
{
// 进入循环
if (gotSignal != 0) {
if(gotSignal == 2)
break;
if(gotSignal == 3)
// 等待回车键按下
std::cin.ignore();
gotSignal = 0;
}
}
}
示例的另外一种简单方式:
char get_enter;
std::cin.get(get_enter);