1. #include <unistd.h>
    2. #include <signal.h>
    3. #include <stdio.h>
    4. void handler(int sig) //信号处理函数的实现
    5. {
    6. printf("SIGINT sig");
    7. }
    8. int main()
    9. {
    10. sigset_t new,old;
    11. struct sigaction act;
    12. act.sa_handler = handler; //信号处理函数handler
    13. sigemptyset(&act.sa_mask);
    14. act.sa_flags = 0;
    15. sigaction(SIGINT, &act, 0); //准备捕捉SIGINT信号
    16. sigemptyset(&new);
    17. sigaddset(&new, SIGINT);
    18. sigprocmask(SIG_BLOCK, &new, &old); //将SIGINT信号阻塞,同时保存当前信号集
    19. printf("Blocked\n");
    20. sigprocmask(SIG_SETMASK, &old, NULL); //取消阻塞
    21. kill(getpid(),SIGINT);//可以看得到在这里并没有将进程杀死,信号丢失
    22. printf("Blocked2\n");
    23. pause();
    24. return 0;
    25. }
    #include <unistd.h>
    #include <signal.h>
    #include <stdio.h>
    void handler(int sig)   //信号处理程序
    {
       if(sig == SIGINT)
          printf("SIGINT sig\n");
       else if(sig == SIGQUIT)
          printf("SIGQUIT sig\n");
       else
          printf("SIGUSR1 sig\n");
    }
    
    int main()
    {
        sigset_t new,old,wait;   //三个信号集
        struct sigaction act;
        act.sa_handler = handler;
        sigemptyset(&act.sa_mask);
        act.sa_flags = 0;
        sigaction(SIGINT, &act, 0);    //可以捕捉以下三个信号:SIGINT/SIGQUIT/SIGUSR1
        sigaction(SIGQUIT, &act, 0);
        sigaction(SIGUSR1, &act, 0);
    
        sigemptyset(&new);
        sigaddset(&new, SIGINT);  //SIGINT信号加入到new信号集中
        sigemptyset(&wait);
        sigaddset(&wait, SIGUSR1);  //SIGUSR1信号加入wait
        sigprocmask(SIG_BLOCK, &new, &old);       //将SIGINT阻塞,保存当前信号集到old中    
    
        //程序在此处挂起;用wait信号集替换new信号集。即:过来SIGUSR1信  号,阻塞掉,程序继续挂起;过来其他信号,例如SIGINT,则会唤醒程序。执行sigsuspend的原子操作。注意:如果“sigaddset(&wait, SIGUSR1);”这句没有,则此处不会阻塞任何信号,即过来任何信号均会唤醒程序。
        //sigsuspend执行信号处理函数时会重新将进程信号集设置为new,该系统调用始终返回-1,并将errno设置为EINTR。
        printf("start sigsuspend\n");
        if(sigsuspend(&wait) != -1)  
            printf("sigsuspend error");
        printf("After sigsuspend\n");
        sleep(3); //这里ctrl+c 不会调用信号处理函数
        printf("Unset procmask\n");
        sigprocmask(SIG_SETMASK, &old, NULL);
        sleep(3); //这里ctrl+c 会调用信号处理函数
        return 0;
    }