windows平台下,采用独立线程在控制台捕捉信号并处理,不影响主线程的执行
* 常用于内存分析:截取片段时定位起/止时间
demo:
/**
* @brief win下 控制台捕捉信号:
*
* win下 采用独立线程在控制台捕捉信号并处理,
* 常用于内存分析:截取片段时定位起/止时间
*
* @param pert
* @param 2023年11月7日10:58:05
*/
#include<thread>
#include <conio.h>
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
std::thread* threadOne = new std::thread([&](){
int ch;
while (1){
if (_kbhit()){//如果有按键按下,则_kbhit()函数返回真
ch = _getch();//使用_getch()函数获取按下的键值
cout<<"\ninput:" << ch;
if (ch == 121) {//“Y键”
// 执行cmd命令创建文件并写入字符串
string command = "echo Hello, world! > test.txt";
system(command.c_str());
//执行开始截取片段或执行结束截取片段等操作--windbg
}
if (ch == 27){ break; }//当按下ESC时退出循环,ESC键的键值时27.
}
_sleep(50);//防抖
}
});
while (1) {
//doing main thing
for (size_t i = 0; i < 1000; i++) {
for (size_t j = 0; j < 1000; j++) {
_sleep(50);
}
}
}
}
win、lin平台下捕获信号的另一种方式案例:
/**
* @brief win下 控制台捕捉信号
*
* @param pert
* @param 2023年11月7日11:06:50
*/
#include <iostream>
#include <csignal>
// 信号处理函数
void signalHandler(int signum)
{
std::cout << "捕获到信号:" << signum << std::endl;
// 处理信号逻辑...
}
int main() {
// 注册信号处理函数 ---注意要在程序loop前进行注册!
#ifdef _WIN32
signal(SIGINT, signalHandler);
std::cout << "按下 Ctrl+C 来触发信号" << std::endl;
#else // _WIN32
signal(SIGTSTP, signalHandler);//win不支持
std::cout << "按下 Ctrl+Z 来触发信号" << std::endl;
#endif // _WIN32
while (true) {
// 无限循环,等待信号的触发
_sleep(100);
}
return 0;
}