zoukankan      html  css  js  c++  java
  • 信号屏蔽的切换的理解sigsuspend

    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <unistd.h>
    void handle(int s)
    {
            printf("外部用户中断处理...!
    ");
            sleep(5);
            printf("外部用户中断处理结束!
    ");
    }
    
    main()
    {
            int sum=0;
            int i;
            sigset_t sigs,sigt,sigu;
            sigemptyset(&sigs);
            sigemptyset(&sigt);
            sigemptyset(&sigu);
            sigaddset(&sigs,SIGINT);
            sigaddset(&sigs,SIGUSR1);//
            signal(SIGINT,handle);
            sigprocmask(SIG_BLOCK,&sigs,0);
            for(i=0;i<10;i++)
            {
            printf("正在拷贝电影<%d>!
    ",i);
            sleep(7);//模拟业务处理时间比较长
            printf("电影拷贝完毕<%d>!
    ",i);
            sigpending(&sigu);
            if(sigismember(&sigu,SIGINT))
            {
            sigsuspend(&sigt);
            }
    
            }
            printf("所有电影拷贝完毕
    ",sum);
            printf("over!
    ");
            sigprocmask(SIG_UNBLOCK,&sigs,0);
    }
    

    sigsuspend(sigset_t  sigs);功能: 屏蔽新的信号,原来屏蔽的信号失效。sigsuspend是阻塞函数,对参数信号屏蔽,对参数没有指定的信号不屏蔽,但当没有屏蔽的信号处理函数调用完毕sigsuspend函数返回。

    sigsuspend返回条件:

    1. 信号发生,并且信号是非屏蔽信号
    2. 信号必须要处理,而且处理函数返回后sigsuspend才返回。

    sigsuspend设置新的屏蔽信号,保存旧的屏蔽信号,而且当sigsuspend返回的时候,恢复旧的屏蔽信号。

    其实可以这样理解:sigsuspend=pause()+指定屏蔽的信号

  • 相关阅读:
    第五章 Mybatis注解
    第四章 Mbatis高级查询
    第三章 Mybatis动态Sql
    第二章 Mybatis映射文件
    第一章 初识Mybatis
    Mybatis大纲设计
    项目总结
    第二周项目功能实现
    第一周项目功能实现
    客车网上售票系统需求分析
  • 原文地址:https://www.cnblogs.com/huacw/p/3579411.html
Copyright © 2011-2022 走看看