SetConsoleCtrlHandler

linux下

linux下通过signal(SIG_ID,/*处理函数*/);来注册
需要root权限时: UlimitResource();

void SignalSkill(int no)
{}
void ProcessSignal()
{
    signal(SIGEXIT,SignalKill);
    signal(SIGKILL,SignalKill);
    signal(SIGPIPE,SIG_IGN); // send, recv 时网络断开,会收到SIGPIPE, 默认处理为进程终止, 所以忽略
    signal(SIGHUP,SIG_IGN);//ssh终端退出,GameServer不退出
    UlimitResource();
}
windows下

通过函数
BOOL WINAPI SetConsoleCtrlHandler(
_In_opt_ PHANDLER_ROUTINE HandlerRoutine,
_In_ BOOL Add
);

来实现, 例子如下,其中一般主要处理CTRL_C_EVENTCTRL_CLOSE_EVENT两个消息:

 #include <windows.h> 
 #include <stdio.h> 
BOOL CtrlHandler( DWORD fdwCtrlType ) 
{ 
  switch( fdwCtrlType ) 
  { 
    // Handle the CTRL-C signal. 
    case CTRL_C_EVENT: 
      printf( "Ctrl-C event\n\n" );
      Beep( 750, 300 ); 
      return( TRUE );
    // CTRL-CLOSE: confirm that the user wants to exit.  点击右上角的退出按钮, 最多等待5s时间去处理退出工作, 5s后直接关闭;
    case CTRL_CLOSE_EVENT: 
      Beep( 600, 200 ); 
      printf( "Ctrl-Close event\n\n" );
      return( TRUE ); 
    // Pass other signals to the next handler. 
    case CTRL_BREAK_EVENT:  
      Beep( 900, 200 ); 
      printf( "Ctrl-Break event\n\n" );
      return FALSE; 
    case CTRL_LOGOFF_EVENT: 
      Beep( 1000, 200 ); 
      printf( "Ctrl-Logoff event\n\n" );
      return FALSE; 
    case CTRL_SHUTDOWN_EVENT: 
      Beep( 750, 500 ); 
      printf( "Ctrl-Shutdown event\n\n" );
      return FALSE; 
    default: 
      return FALSE; 
  } 
} 
//main中使用如下:
int main( void ) 
{ 
  if( SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ) ) 
  { 
    printf( "\nThe Control Handler is installed.\n" ); 
    printf( "\n -- Now try pressing Ctrl+C or Ctrl+Break, or" ); 
    printf( "\n    try logging off or closing the console...\n" ); 
    printf( "\n(...waiting in a loop for events...)\n\n" ); 
    while( 1 ){ } 
  } 
  else 
  {
    printf( "\nERROR: Could not set control handler"); 
    return 1;
  }
return 0;
}
int main(int argc, char* argv[]) { //注册信号处理函数 SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE); std::cout << "收到退出信号,正在终止程序..." << std::endl; // 调用静态类的方法处理参数 if (ProgramHelper::handleArguments(argc, argv)== 1) { return 1; } //声明锁 std::mutex mtx; //实例化LidarService、cam LidarService rslidar; CameraService cam1(*g_camID, *g_width, *g_height); RS_TITLE << "------------------------------------------------------" << RS_REND; RS_TITLE << " RS_Driver版本: v" << robosense::lidar::getDriverVersion() << RS_REND; RS_TITLE << "------------------------------------------------------" << RS_REND; robosense::lidar::RSDriverParam param; ///< 创建参数对象 param.input_type = robosense::lidar::InputType::ONLINE_LIDAR; ///< 设置雷达输入类型为在线模式 param.input_param.msop_port = 6699; ///< 设置雷达 MSOP 数据端口号,默认值为 6699 param.input_param.difop_port = 7788; ///< 设置雷达 DIFOP 数据端口号,默认值为 7788 param.lidar_type = robosense::lidar::LidarType::RSHELIOS_16P; ///< 设置雷达类型,请确保类型设置正确 param.print(); ///< 打印参数信息 robosense::lidar::LidarDriver<PointCloudMsg> driver; ///< 声明雷达驱动对象 driver.regPointCloudCallback(LidarService::driverGetPointCloudFromCallerCallback, LidarService::driverReturnPointCloudToCallerCallback); ///< 注册点云回调函数 driver.regExceptionCallback(LidarService::exceptionCallback); ///< 注册异常回调函数 if (!driver.init(param)){ ///< 调用初始化函数 RS_ERROR << "驱动初始化失败..." << RS_REND; return -1; } // 启动点云处理线程 std::thread cloud_handle_thread = std::thread(&LidarService::processCloud, &rslidar); driver.start(); ///< 启动雷达驱动线程 RS_DEBUG << "已开始处理雷达数据包......" << RS_REND; cam1.initCamera(); ///< 初始化相机 // 启动相机处理线程 // std::thread image_handle_thread = std::thread(&CameraService::processImage, &cam1, cam1.sharedCap); std::thread image_handle_thread = std::thread([&cam1]() { cam1.processImage(*cam1.sharedCap, cam1.sharedframe); ///< 调用相机图像处理函数 }); // 数据采集循环 for (int i = 0; i < *g_sampleCount; i++) { // 10 秒倒计时用于调整标定板位置 for (int j = *g_sampleInterval; j > 0; j--) { std::this_thread::sleep_for(std::chrono::seconds(1)); // 休眠 1 秒 std::cout << "请调整标定板位置," << j << " 秒后将进行雷达帧和照片帧采集" << std::endl; } // 采集数据帧 { std::lock_guard<std::mutex> lock(mtx); // 加锁以保护共享资源 rslidar.savePCD(rslidar.sharedpclCloud); ///< 保存雷达点云数据 cam1.saveImage(cam1.sharedframe); ///< 保存相机图像数据 } } std::cout << "已完成 "<< *g_sampleCount<<"组图像/点云数据采集(可手动退出程序)" << std::endl; int sig = 0; while (!exit_flag) { Sleep(1000); } // 等待线程结束 image_handle_thread.join(); cloud_handle_thread.join(); return 0; }这是所有片段
最新发布
03-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值