首页 > 其他分享 >signal的samplecode

signal的samplecode

时间:2023-07-24 15:55:42浏览次数:35  
标签:success signal samplecode signals && printf include

一个signal的samplecode, 需要注意的地方是:

  1. 资源的释放和析构
  2. 锁的控制
  3. 资源的清理
  4. 事务的控制

 

/* This is signal handler common code */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <iostream>
#include <vector>
#include <atomic>
#include <csignal>
#include <thread>

volatile std::atomic_bool g_bExitFlag{false};
volatile std::atomic_bool g_bInitFlag{false};

constexpr uint8_t kNumOfThreads = 5;
std::vector<std::thread> gThreads;

void SignalHandlerThread(void) {
	int sig = -1;
	sigset_t sigset;

	if (sigemptyset(&sigset) != 0) {
		/* empty the set of signals */
		printf("Emptying signal set failed.");
		return;
	}

	if (sigaddset(&sigset, SIGTERM) != 0) {
        /* add SIGTERM to signal set */
		printf("Adding SIGTERM to signal set failed.");
		return;
	}

	if (sigaddset(&sigset, SIGINT) != 0) {
        /* add SIGINT to signal set */
		printf("Adding SIGINT to signal set failed.");
		return;
	}

	/* wait until signal SIGTERM/SIGINT occurs */
	while (sig != SIGTERM && sig != SIGINT) {
		if (0 != sigwait(&sigset, &sig)) {
			printf("Sigwait() was called with an invalid signal set.");
			return;
		}
	}

    printf("SignalHandler get the signal(%d)\n", sig);
	g_bExitFlag = true;
}

int SetSignalMask() 
{
	bool success = true;
	sigset_t signals;

	/* Block all signals except SIGABRT, SIGBUS, SIGFPE, SIGILL and SIGSEGV */
	success = success && (sigfillset(&signals) == 0);
	success = success && (sigdelset(&signals, SIGABRT) == 0);
	success = success && (sigdelset(&signals, SIGBUS) == 0);
	success = success && (sigdelset(&signals, SIGFPE) == 0);
	success = success && (sigdelset(&signals, SIGILL)) == 0;
	success = success && (sigdelset(&signals, SIGSEGV) == 0);
	success = success && (pthread_sigmask(SIG_SETMASK, &signals, nullptr) == 0);
	if (!success) {
		printf("SetSignalMask failed. \n");
        return -1;
	}

    return 0;
}

int Init()
{
	/* initialize signal handling */
	SetSignalMask();

	/* spawn a new signal handler thread */
	gThreads.push_back(std::thread(SignalHandlerThread));
    g_bInitFlag = true;
    
    //printf("tid thtread id    :%lu. \n", gThreads.begin()->get_id());
    printf("tid native handle :%lu. \n", static_cast<pthread_t>(gThreads.begin()->native_handle()));

    return 0;
}

void Shutdown()
{
    /* check state */
	/* clean-up */
    /* kill/cancel pthread */

    /* wait pthread */
	printf("Waitfor the threads.\n");
	for (std::vector<std::thread>::iterator it = gThreads.begin();
			it != gThreads.end(); it++) {
		it->join();
	}

	std::cout << "Terminating." << std::endl;
}

int Run()
{
    Init();
    while (!g_bExitFlag) {
        /* Todo:work thread */
    }

    Shutdown();
    return 0;
}

int main() {
    try {
        Run();
    } catch (std::runtime_error& e) {
        std::cout << "Runtime error: " << e.what();
    } catch (std::logic_error& e) {
        std::cout << "Logic error: "<< e.what();
    } catch (std::exception& e) {
        std::cout << "Exception: "<< e.what();
    } catch (...) {
        std::cout << "Unknown exception";
    }

    return 0;
}

  

标签:success,signal,samplecode,signals,&&,printf,include
From: https://www.cnblogs.com/sciapex/p/17577447.html

相关文章

  • ASP.NET Core SignalR -- 系列文章
    ASP.NETCoreSignalR系列(四)-中心筛选器ASP.NETCoreSignalR系列(三)-JavaScript客户端ASP.NETCoreSignalR系列(二)-中心(服务端)ASP.NETCoreSignalR入门  出处:https://www.cnblogs.com/xyh9039/tag/SignalR/......
  • ASP.NET Core SignalR 系列(四)- 中心筛选器
    本章将和大家分享ASP.NETCoreSignalR中的中心筛选器。本文大部分内容摘自微软官网:https://learn.microsoft.com/zh-cn/aspnet/core/signalr/hub-filters?view=aspnetcore-7.0废话不多说,下面我们直接进入本章主题。中心筛选器:在ASP.NETCore5.0或更高版本中可用。允许......
  • ASP.NET Core SignalR 系列(三)- JavaScript 客户端
    本章将和大家分享ASP.NETCoreSignalR中的JavaScript客户端。ASP.NETCoreSignalRJavaScript客户端库使开发人员能够调用服务器端SignalR中心代码。本文大部分内容摘自微软官网:https://learn.microsoft.com/zh-cn/aspnet/core/signalr/javascript-client?view=aspnetcore......
  • APUE-signal-自定义信号
    [Linux定义信号的一些细节处理-自定义信号变量]https://blog.csdn.net/renlonggg/article/details/78309662#defineMY_SINGL_1(SIGRTMIN+1)/*信号函数,发送接受*/voidsignal_handler(intsignalnum){printf("Getsignal%d.\n",signalnum);}voidsigna......
  • ORA-65221 signalled during: alter pluggable database application APP$CDB$SYSTEM
    给一台Oracle19.12.0.0.0数据库应用补丁,升级到Oracle19.16.0.0.0时,做datapatch的时候,监控发现数据库的告警日志出现下面错误:2023-07-11T15:09:44.776403+08:00alter pluggable database application APP$CDB$SYSTEM begin install '1.0'ORA-65221 signalled during: ......
  • Signal-iOS 5.9.0编译问题
    1.当我们使用pod管理  pod'SDWebImage/WebP' ,执行podinstall时,发生报错.先看具体报错: 截屏2020-07-06上午11.12.15.png2.报错产生原因是由于gitclone 的地址是 https://chromium.googlesource.com/webm/libwebp,需要FQ3.不想FQ,可以使用github上的地址......
  • SignalR 外部调用自定义Hub类的方法,Clients为null
    这是因为外部调用的类的对象和你连接的Hub类的对象,这两个对象不!一!样!解决方法在自定义的Hub类中,注入IHubContext对象,然后在方法中调用IHubContext对象来向前端推送数据publicclassDataHub:AbpCommonHub,ITransientDependency{publicIOnlineClientManag......
  • pyqt5-pyqtSignal信号
    1、介绍pyqt项目中,子线程中存在两种需求:子线程结束时,以信号的形式触发事件,调用方法,与ui组件交互子线程运行过程中,持续以信号的形式触发事件,调用方法与ui组件交互可以基于pyqtSignal实现。(189条消息)【python编程】使用pyqtsignal实现消息回调的注意事项_时空worker的博客......
  • ASP.NET Core SignalR 系列(二)- 中心(服务端)
    本章将和大家分享ASP.NETCoreSignalR中的中心(服务端)。本文大部分内容摘自微软官网:https://learn.microsoft.com/zh-cn/aspnet/core/signalr/hubs?view=aspnetcore-7.0废话不多说,我们直接来看一个Demo,Demo的目录结构如下所示:本Demo的Web项目为ASP.NETCoreWeb应用程序(目......
  • SignalR 入门
    SignalR介绍SignalR是一个开源的实时通信库,用于构建实时、双向的应用程序。它提供了简化实时通信的功能,允许服务器主动向客户端推送数据,实现实时更新和即时通知的功能。SignalR具有高度集成性、跨平台支持和可扩展性,适用于实时聊天、在线游戏、监控系统等各种应用场景。Signa......