信号处理测试代码

#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);

 /*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*/

///使用 

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)

{} 

原文地址:https://www.cnblogs.com/hbt19860104/p/2626387.html