⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 signalprocess.cpp

📁 电力故障信息采集,主要是针对南自的保护装置,这个程序用在Linux操作系统下
💻 CPP
字号:
#include "signalprocess.h"#include "publicclass.h"#include "ysdataprocess.h"extern CPublicClass g_PublicClass;void SignalProcessDef1(int signum,siginfo_t *info,void *myact){    if(signum==0||!info||!myact) return;    SignalProcessDef1x(signum,info,myact);    return;}/////////////////////安装程序中的备用信号处理机制/////////////////////////////////void SignalProcessDef2(int signum,siginfo_t *info,void *myact){    if(signum==0||!info||!myact) return;    SignalProcessDef2x(signum,info,myact);    return;}void SignalProcessDef3(int signum,siginfo_t *info,void *myact){    if(signum==0||!info||!myact) return;    SignalProcessDef3x(signum,info,myact);    return;}void SignalProcessDef4(int signum,siginfo_t *info,void *myact){    if(signum==0||!info||!myact) return;    SignalProcessDef4x(signum,info,myact);    return;}void SignalProcessDef5(int signum,siginfo_t *info,void *myact){    if(signum==0||!info||!myact) return;    SignalProcessDef5x(signum,info,myact);    return;}void SignalProcessDef_NoticQueue(int signum,siginfo_t *info,void *myact){    if(signum==0||!info||!myact) return;    SignalProcessDef_NoticQueuex(signum,info,myact);    return;}///////////////测试信息/////////////////////////void SignalProcessDef1x(int signum,siginfo_t *info,void *myact){    if(signum==0||!info||!myact) return;    g_PublicClass.m_Signal.SendSignal(info->si_pid, 38, 1, NULL, 0);    return;}//////////////正常结束处理//////////////////void SignalProcessDef2x(int signum,siginfo_t *info,void *myact){    if(signum==0||!info||!myact) return;    BCDataProcess dp;long hdbc=-1;    QString serr="";serr.sprintf("模块正常结束");    dp.WriteSysLog(hdbc,0,serr);    _printf_error(OTHER,"模块%s[%d]正常结束%s\n",				  g_PublicClass.m_ModuleName.data(),				  g_PublicClass.m_SelfPid , 				  getTimeStr());	//Liang	2006/7/28    //删除本进程的注册信息    hdbc=-1;    dp.WhenModuleExit(hdbc,g_PublicClass.m_SelfPid);    kill(g_PublicClass.m_SelfPid,SIGKILL);int kill;waitpid(g_PublicClass.m_SelfPid,&kill,0);    return;}//////////////内存出错的处理//////////////////void SignalProcessDef3x(int signum,siginfo_t *info,void *myact){    if(signum==0||!info||!myact) return;    BCDataProcess dp;long hdbc=-1;    QString serr="";serr.sprintf("模块由于内存出错异常退出");    dp.WriteSysLog(hdbc,0,serr);    _printf_error(ERROR,"模块%s[%d]由于内存出错异常退出%s\n",				  g_PublicClass.m_ModuleName.data(),				  g_PublicClass.m_SelfPid ,				  getTimeStr());	//Liang	2006/7/28    //删除本进程的注册信息    hdbc=-1;    dp.WhenModuleExit(hdbc,g_PublicClass.m_SelfPid);    throw ExceptionTracer();    return;}//////////////浮点出错的处理//////////////////void SignalProcessDef4x(int signum,siginfo_t *info,void *myact){    if(signum==0||!info||!myact) return;    BCDataProcess dp;long hdbc=-1;    QString serr="";serr.sprintf("模块由于浮点出错异常退出");    dp.WriteSysLog(hdbc,0,serr);    _printf_error(ERROR,"模块%s[%d]由于浮点出错异常退出%s\n",				  g_PublicClass.m_ModuleName.data(),				  g_PublicClass.m_SelfPid ,				  getTimeStr());	//Liang	2006/7/28    //删除本进程的注册信息    hdbc=-1;    dp.WhenModuleExit(hdbc,g_PublicClass.m_SelfPid);    throw ExceptionTracer();    return;}//////////////处理断开的管道//////////////////void SignalProcessDef5x(int signum,siginfo_t *info,void *myact){    if(signum==0||!info||!myact) return;    BCDataProcess dp;long hdbc=-1;    QString serr("断开的管道");    dp.WriteSysLog(hdbc,0,serr);    _printf_error(WARN,"模块%s[%d]断开的管道%s\n",				  g_PublicClass.m_ModuleName.data(),				  g_PublicClass.m_SelfPid ,				  getTimeStr());	//Liang	2006/7/28    return;}void SignalProcessDef_NoticQueuex(int signum,siginfo_t *info,void *myact){    if(signum==0||!info||!myact) return;    //打开接收队列锁    g_PublicClass.m_NoticQueueLock.unlock();}//*************************信号机制********************************//CSignal :: CSignal(){    return;}CSignal :: ~CSignal(){    return;}///////////////////////////////////////////安装信号机制/////////////////////////////////////////////bool CSignal :: InstallSignalProcess1(){    struct sigaction act;    sigemptyset(&act.sa_mask);    act.sa_flags=SA_SIGINFO;    act.sa_sigaction=SignalProcessDef1;    int ret=sigaction(USESIG,&act,NULL);    if(ret<0) return 0;    return 1;}///////////////////////////////////////////安装信号备用机制/////////////////////////////////////////////bool CSignal :: InstallSignalProcess2()	//处理正常中止{    struct sigaction act;    sigemptyset(&act.sa_mask);    act.sa_flags=SA_SIGINFO;    act.sa_sigaction=SignalProcessDef2;    int ret=sigaction(SIGINT,&act,NULL);    if(ret<0) return 0;    return 1;}bool CSignal :: InstallSignalProcess3()	//处理内存出错中止{    struct sigaction act;    sigemptyset(&act.sa_mask);    act.sa_flags=SA_SIGINFO;    act.sa_sigaction=SignalProcessDef3;    int ret=sigaction(SIGSEGV,&act,NULL);    if(ret<0) return 0;    return 1;}bool CSignal :: InstallSignalProcess4()	//处理浮点出错中止{    struct sigaction act;    sigemptyset(&act.sa_mask);    act.sa_flags=SA_SIGINFO;    act.sa_sigaction=SignalProcessDef4;    int ret=sigaction(SIGFPE,&act,NULL);    if(ret<0) return 0;    return 1;}bool CSignal :: InstallSignalProcess5()	//处理断开的管道{    struct sigaction act;    sigemptyset(&act.sa_mask);    act.sa_flags=SA_SIGINFO;    act.sa_sigaction=SignalProcessDef5;    int ret=sigaction(SIGPIPE,&act,NULL);    if(ret<0) return 0;    return 1;}bool CSignal :: InstallSignal_NoticQueue()	//{    struct sigaction act;    sigemptyset(&act.sa_mask);    act.sa_flags=SA_SIGINFO;    act.sa_sigaction=SignalProcessDef_NoticQueue;    int ret=sigaction(NOTICQUEUE,&act,NULL);    if(ret<0) return 0;    return 1;}///////////////////////////////////////发送一个信号///////////////////////////////////////////////////////bool CSignal :: SendSignal(pid_t pid,int sig,int type,void* ptr,int iSize){    union sigval mysigval;    ptr=NULL;iSize=0;    mysigval.sival_int=type;    int ret=sigqueue(pid,sig,mysigval);    if(ret<0) return 0;    return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -