zoukankan      html  css  js  c++  java
  • 线程中的信号控制

    对比

    设置进程/线程屏蔽信号:sigprocmask/pthread_sigmask
    等待指定进程/线程结束:waitpid/pthread_join
    向指定进程/线程发送信号:kill/pthread_kill
    线程特有的等待指定的信号发生:sigwait
    gcc编译时需加参数:gcc test.c -lpthread

    例子

    sigset_t mask;
    void err_quit(const char *str){
        perror(str);
        exit(1);
    }
    void * thr_fn(void *arg){
        int err,signo;
        for(;;){
            err=sigwait(&mask,&signo);
            if(err != 0)
                err_quit("sigwait error");
            switch (signo){
                case SIGINT:
                    puts("interrupt");
                    break;
                case SIGQUIT:
                    puts("quit");
                    pthread_exit(0);
                default:
                    printf("unexpected signal %d
    ",signo);
                    pthread_exit((void *)1);
            }
        }
    }
    int main(void){
        int err;
        sigset_t oldmask;
        pthread_t tid;
     
    //main线程中屏蔽的信号, 刚好是tid线程中等待的信号
        sigemptyset(&mask);
        sigaddset(&mask,SIGINT);
        sigaddset(&mask,SIGQUIT);
        sigaddset(&mask,SIGUSR1);
        if((err=pthread_sigmask(SIG_BLOCK,&mask,&oldmask)) !=0)
            err_quit("pthread_sigmask error");
        err=pthread_create(&tid,NULL,thr_fn,0);
        if(err != 0)
            err_quit("pthread_sigqueue error");
     
    //以下三行可注释倒, 在终端手动输入C-c, C-
        sleep(2);
        pthread_kill(tid,SIGINT);
        pthread_kill(tid,SIGQUIT);
    
        err=pthread_join(tid,NULL);
        if(err != 0)
            err_quit("pthread_join error");
        if(sigprocmask(SIG_SETMASK,&oldmask,NULL) <0)
            err_quit("sigprocmask error");
        puts("main over");
        return 0;
    }
    
  • 相关阅读:
    java实现复制网站内容
    java实现复制网站内容
    java实现递归连续数
    java实现递归连续数
    java实现递归连续数
    java实现递归连续数
    java实现递归连续数
    java实现串中找数字
    java实现串中找数字
    java实现串中找数字
  • 原文地址:https://www.cnblogs.com/cfans1993/p/5699270.html
Copyright © 2011-2022 走看看