• 信号处理测试代码


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

    {} 

  • 相关阅读:
    html实体引用
    nginx配置奇怪问题记录
    20191025-生产事故记录
    abp审计日志功能的关闭
    mysql根据一张表更新另一张表数据
    redis-cli连接redis服务器操作
    错误记录-MySql.Data.MySqlClient.MySqlException (0x80004005): Timeout expired.
    UID,GID,口令
    【搬砖】/etc/passwd 文件结构
    《图形学》实验五:改进的Bresenham算法画直线
  • 原文地址:https://www.cnblogs.com/hbt19860104/p/2626387.html
Copyright © 2020-2023  润新知