信号处理测试代码
#include <sys/sem.h>
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include <stdarg.h>
#include <string.h>
sigset_t oldset;
typedef struct __sig_mask{
sigset_t sig_newset,sig_oldset;
int set_flag;/*当调用完mask_procmask后,置1,否则,为0*/
int (*mask_addsig)(struct __sig_mask* pSigMask,int signum,int sig1,...);
int (*mask_addAll)(struct __sig_mask* pSigMask);
int (*mask_procmask)(struct __sig_mask* pSigMask);
int (*unmask)(struct __sig_mask* pSigMask);
}SIG_MASK,*P_SIG_MASK;
int getMaskObject(P_SIG_MASK p_sig_mask);
char *getCurrFileName();
int createCriticalSection(int id);
int enterCriticalSection(int semID);
int releaseCriticalSection(int semID);
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include <stdarg.h>
#include <string.h>
sigset_t oldset;
typedef struct __sig_mask{
sigset_t sig_newset,sig_oldset;
int set_flag;/*当调用完mask_procmask后,置1,否则,为0*/
int (*mask_addsig)(struct __sig_mask* pSigMask,int signum,int sig1,...);
int (*mask_addAll)(struct __sig_mask* pSigMask);
int (*mask_procmask)(struct __sig_mask* pSigMask);
int (*unmask)(struct __sig_mask* pSigMask);
}SIG_MASK,*P_SIG_MASK;
int getMaskObject(P_SIG_MASK p_sig_mask);
char *getCurrFileName();
int createCriticalSection(int id);
int enterCriticalSection(int semID);
int releaseCriticalSection(int semID);
/*signal process segment*/
int mask_addsig(P_SIG_MASK pSigMask,int signum,int sig1,...)
{
va_list arg_ptr;
int signal;
int i;
if(!pSigMask)
return -1;
va_start(arg_ptr,signum);
for(i=0;i<signum;i++)
{
signal=va_arg(arg_ptr,int);
if (sigaddset(&(pSigMask->sig_newset), signal)!=0)
{
va_end(arg_ptr);
return -1;
}
}
if (sigaddset(&(pSigMask->sig_newset), SIGINT)!=0)
{
return -1;
}
va_end(arg_ptr);
return 1;
}
int mask_addAll(P_SIG_MASK pSigMask)
{
if(!pSigMask)
return -1;
sigfillset(&(pSigMask->sig_newset));
return 1;
}
int mask_procmask(P_SIG_MASK pSigMask)
{
if(!pSigMask)
return -1;
/*printf("...sig_newset:%x\n",pSigMask->sig_newset);*/
if(pSigMask->set_flag)
return 0;
if (sigprocmask(SIG_SETMASK, &(pSigMask->sig_newset),&(pSigMask->sig_oldset)) != 0)
{
return -1;
}
pSigMask->set_flag=1;
return 1;
}
int mask_unmask(P_SIG_MASK pSigMask)
{
if(!pSigMask)
return -1;
/*printf("mask_unmask sig_oldset:%x\n",pSigMask->sig_oldset);*/
if (sigprocmask(SIG_SETMASK, &(pSigMask->sig_oldset),NULL) != 0)
{
return -1;
}
pSigMask->set_flag=0;
return 1;
}
int getMaskObject(P_SIG_MASK p_sig_mask)
{
if (sigemptyset(&(p_sig_mask->sig_newset))||sigemptyset(&(p_sig_mask->sig_oldset)))
return -1;
p_sig_mask->set_flag=0;
p_sig_mask->mask_addsig=mask_addsig;
p_sig_mask->mask_addAll=mask_addAll;
p_sig_mask->mask_procmask=mask_procmask;
p_sig_mask->unmask=mask_unmask;
return 1;
}
/*signal process segment end*/
{
va_list arg_ptr;
int signal;
int i;
if(!pSigMask)
return -1;
va_start(arg_ptr,signum);
for(i=0;i<signum;i++)
{
signal=va_arg(arg_ptr,int);
if (sigaddset(&(pSigMask->sig_newset), signal)!=0)
{
va_end(arg_ptr);
return -1;
}
}
if (sigaddset(&(pSigMask->sig_newset), SIGINT)!=0)
{
return -1;
}
va_end(arg_ptr);
return 1;
}
int mask_addAll(P_SIG_MASK pSigMask)
{
if(!pSigMask)
return -1;
sigfillset(&(pSigMask->sig_newset));
return 1;
}
int mask_procmask(P_SIG_MASK pSigMask)
{
if(!pSigMask)
return -1;
/*printf("...sig_newset:%x\n",pSigMask->sig_newset);*/
if(pSigMask->set_flag)
return 0;
if (sigprocmask(SIG_SETMASK, &(pSigMask->sig_newset),&(pSigMask->sig_oldset)) != 0)
{
return -1;
}
pSigMask->set_flag=1;
return 1;
}
int mask_unmask(P_SIG_MASK pSigMask)
{
if(!pSigMask)
return -1;
/*printf("mask_unmask sig_oldset:%x\n",pSigMask->sig_oldset);*/
if (sigprocmask(SIG_SETMASK, &(pSigMask->sig_oldset),NULL) != 0)
{
return -1;
}
pSigMask->set_flag=0;
return 1;
}
int getMaskObject(P_SIG_MASK p_sig_mask)
{
if (sigemptyset(&(p_sig_mask->sig_newset))||sigemptyset(&(p_sig_mask->sig_oldset)))
return -1;
p_sig_mask->set_flag=0;
p_sig_mask->mask_addsig=mask_addsig;
p_sig_mask->mask_addAll=mask_addAll;
p_sig_mask->mask_procmask=mask_procmask;
p_sig_mask->unmask=mask_unmask;
return 1;
}
/*signal process segment end*/
///使用
SIG_MASK sig_mask;
P_SIG_MASK p_sig_mask=&sig_mask;
p_sig_mask->mask_addsig(p_sig_mask,1,SIGTERM);
if(p_sig_mask->mask_procmask(p_sig_mask)==-1)
{}
......
if(p_sig_mask->unmask(p_sig_mask)==-1)
{}