当系统中运行一个服务端进程后通过ctrl+z并不结束进程,但当再次起该服务后该服务无法运行,需查找该服务的进程id通过kill指令结束该进程,本次通过在源码中加入signal函数,在服务运行过程中按下ctrl+z即可完全结束该进程。
一、头文件引用
#include <signal.h>
二、指针函数的声明
signal
函数一个参数是一个函数指针,而类中成员函数的地址需要一个隐含的this
指针来调用。 为了解决这个问题,可以使用静态成员函数或者全局函数作为信号处理函数。加入static关键词声明该函数为静态函数可作为signal的参数,也可通过typedef定义该函数。
static void SignalHandler(int signum) {
if (signum == SIGTSTP) {
std::cout << "Received SIGTSTP. exiting..." << std::endl;
exit(0);
}
}
typedef void (*SignalHandler)(int);
void SignalHandler(int signum) {
if (signum == SIGTSTP) {
std::cout << "Received SIGTSTP. exiting..." << std::endl;
exit(0);
}
}
三、主函数的调用
int main() {
signal(SIGINT, SignalHandler);
while(1){
// 服务线程
..........
..........
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
};
return 0;
}
在主函数中包含一个服务端线程,按下ctrl+z后进程就会完全结束,无需手动去kill进程。