signal check

/*************************************************************************
    > File Name: SignalHandlerInstallation
    > Author: wangzhicheng
    > Mail: 2363702560@qq.com 
    > Created Time: 2017-01-14
	> Statement: install the signal handler
 ************************************************************************/
#ifndef SIGNAL_HANDLER_INSTALLATION
#define SIGNAL_HANDLER_INSTALLATION
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <vector>
#include <algorithm>
namespace signalhandlerinstallation
{
using namespace std;
class SignalHandlerInstallation
{
private:
	struct sigaction m_action;
	static SignalHandlerInstallation m_Instance;
private:
	SignalHandlerInstallation()
	{
		m_action.sa_flags = 0;
		sigemptyset(&m_action.sa_mask);
	}
public:
	inline static SignalHandlerInstallation &GetInstance()
	{
		return m_Instance; 
	}
	void Install(const vector<int>&signums, void (*pHandler)(int) )
	{
		m_action.sa_handler = pHandler;
		for_each(signums.begin(), signums.end(), [this](int signum)
				{
				sigaction(signum, &m_action, NULL);
				});

	}
};
SignalHandlerInstallation SignalHandlerInstallation::m_Instance;
}
#endif

/*************************************************************************
    > File Name: TermSignalCheck
    > Author: wangzhicheng
    > Mail: 2363702560@qq.com 
    > Created Time: 2017-01-14
	> Statement: to check whether the terminal signal will come
 ************************************************************************/
#ifndef TERM_SIGNAL_CHECK
#define TERM_SIGNAL_CHECK
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
namespace termsignalcheck
{
using namespace std;
class TermSignalCheck
{
public:
	static bool IsComing;
	static void Handler(int signum) 
	{
		cout << "terminated signal is catched...!" << endl;
		if(!IsComing) IsComing = true;
	}
};
bool TermSignalCheck::IsComing = false;
}
#endif

/*************************************************************************
    > File Name: main.cpp
    > Author: wangzhicheng
    > Mail: 2363702560@qq.com 
    > Created Time: 2017-01-14
	> Statement: testing suit
 ************************************************************************/
#include <fstream>
#include <thread>
#include "SignalHandlerInstallation.h"
#include "TermSignalCheck.h"
using namespace signalhandlerinstallation;
using namespace termsignalcheck;
void func()
{
	ifstream is("./input.data");
	if(!is) return;
	string line;
	while(getline(is, line))
	{
		cout << "read line = " << line << endl;
		if(TermSignalCheck::IsComing) break;
		sleep(2);
	}
	is.close();

}
int main() 
{
	vector<int>signums_term;
	signums_term.push_back(SIGINT);
	signums_term.push_back(SIGTERM);
	SignalHandlerInstallation::GetInstance().Install(signums_term, TermSignalCheck::Handler);
	thread th(func);
	th.detach();
	sleep(3);
	cout << "I am over...!" << endl;
	while(1)
	{
		if(TermSignalCheck::IsComing) break;
		sleep(10);
	}

	return 0;
}

CC=g++
all:
	$(CC) -std=c++11 -g -o TestSignalCheck main.cpp SignalHandlerInstallation.h TermSignalCheck.h -pthread -lpthread 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值