C++ signal handler sample

来源:互联网 发布:淘宝 已验证正品 编辑:程序博客网 时间:2024/05/02 13:27

:cat signal.c

#include <signal.h>
#include <errno.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>

void* sigmgr_thread();

int main()
{
    sigset_t bset;
    int             i;
    pid_t           pid = getpid();
    pthread_t       ppid;
   

    // Block SIGTERM and SIGUSR1
    sigemptyset(&bset);
    sigaddset(&bset, SIGTERM);
    sigaddset(&bset, SIGUSR1);
    pthread_sigmask(SIG_BLOCK, &bset, NULL);

   
    pthread_create(&ppid, NULL, sig_thread, NULL);
 
    for (i = 0; i < 50; i++) {
        printf("in main() sleep/n");
        sleep(10);
    }
    exit (0);
}

 
void* sig_thread()
{
    sigset_t   waitset, oset;
    siginfo_t  info;
    int        rc;

    sigemptyset(&waitset);
    sigaddset(&waitset, SIGTERM);
    sigaddset(&waitset, SIGUSR1);

    while (1)  {
        printf("in sig_thread()/n");
        rc = sigwaitinfo(&waitset, &info);
        if (rc != -1) {
            printf("sigwaitinfo() get a signal - %d/n", rc);
            if (info.si_signo == SIGUSR1)
                                printf("sigwaitinfo() get a signal - %d/n", rc);
            else if (info.si_signo == SIGTERM)
                                printf("sigwaitinfo() get a signal - %d/n", rc);
           
        } else {
            printf("sigwaitinfo() returned err: %d; %s/n", errno, strerror(errno));
        }
    }
}

 

 

:cc signal.c -lrt

:kill -16 $PID

 

 

------------------------------------------------------------------------------------------------------------

--------------------------------------Another example-------------------------------------------------

 

void my_sighandler(int signum)
{
    if(signum==SIGUSR1) {
        // here 1
    } else if(signum==SIGUSR2) {
        // here 2
    }
}

int main()
{

   int pid,k,stat;
   struct sigaction user_action;
   sigset_t block_mask;

   sigfillset(&block_mask);
   user_action.sa_handler=my_sighandler;
   user_action.sa_mask=block_mask;
   user_action.sa_flags=0;
   sigaction(SIGUSR1,&user_action,NULL);
   sigaction(SIGUSR2,&user_action,NULL);

   // here
}

原创粉丝点击