📄 signalprocess.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 + -