• linux 异步信号的同步处理方式


    参考博客https://www.cnblogs.com/jiangzhaowei/p/4193283.html

    #include <signal.h>
    #include <errno.h>
    #include <pthread.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void sig_handler(int signum)
    {
        static int j = 0;
        static int k = 0;
        pthread_t  sig_ppid = pthread_self(); 
        // used to show which thread the signal is handled in.
       
        if (signum == SIGUSR1) {
            printf("thread %d, receive SIGUSR1 No. %d
    ", sig_ppid, j);
            j++;
        //SIGRTMIN should not be considered constants from userland, 
        //there is compile error when use switch case
        } else if (signum == SIGRTMIN) {
            printf("thread %d, receive SIGRTMIN No. %d
    ", sig_ppid, k);
            k++;
        }
    }
    
    void* worker_thread()
    {
        pthread_t  ppid = pthread_self();
        pthread_detach(ppid);
        while (1) {
            printf("I'm thread %d, I'm alive
    ", ppid);
            sleep(10);
        }
    }
    
    void* sigmgr_thread()
    {
        sigset_t   waitset, oset;
        siginfo_t  info;
        int        rc;
        pthread_t  ppid = pthread_self();
    
        pthread_detach(ppid);
    
        sigemptyset(&waitset);
        sigaddset(&waitset, SIGRTMIN);
        sigaddset(&waitset, SIGUSR1);
    
        while (1)  {
            rc = sigwaitinfo(&waitset, &info); //sigwaitinfo()  suspends  execution  of the calling thread until one of the signals in set is pending.
            if (rc != -1) {
                printf("sigwaitinfo() fetch the signal - %d
    ", rc);
                sig_handler(info.si_signo);
            } else {
                printf("sigwaitinfo() returned err: %d; %s
    ", errno, strerror(errno));
            }
        }
    }
    
    
    int main()
    {
        sigset_t bset, oset;
        int             i;
        pid_t           pid = getpid();
        pthread_t       ppid;
        
    
        // Block SIGRTMIN and SIGUSR1 which will be handled in 
        //dedicated thread sigmgr_thread()
        // Newly created threads will inherit the pthread mask from its creator 
        sigemptyset(&bset);
        sigaddset(&bset, SIGRTMIN);
        sigaddset(&bset, SIGUSR1);
        if (pthread_sigmask(SIG_BLOCK, &bset, &oset) != 0)
            printf("!! Set pthread mask failed
    ");
        
        // Create the dedicated thread sigmgr_thread() which will handle 
        // SIGUSR1 and SIGRTMIN synchronously
        pthread_create(&ppid, NULL, sigmgr_thread, NULL);
      
        // Create 5 worker threads, which will inherit the thread mask of
        // the creator main thread
        for (i = 0; i < 5; i++) {
            pthread_create(&ppid, NULL, worker_thread, NULL);
        }
    
        // send out 50 SIGUSR1 and SIGRTMIN signals
        for (i = 0; i < 50; i++) {
            kill(pid, SIGUSR1);
            printf("main thread, send SIGUSR1 No. %d
    ", i);
            kill(pid, SIGRTMIN);
            printf("main thread, send SIGRTMIN No. %d
    ", i);
            sleep(10);
        }
        exit (0);
    }
    
  • 相关阅读:
    go语言的运行时支持到底是多线程还是单线程
    丑数
    把数组排成最小数
    连续子数组的最大和
    最小的k个数
    数组中出现次数超过一半的数字
    字符串的排序
    二叉搜索树与双向链表
    复杂链表的赋值
    二叉树中和为某一值的路径
  • 原文地址:https://www.cnblogs.com/DXGG-Bond/p/14344036.html
Copyright © 2020-2023  润新知