zoukankan      html  css  js  c++  java
  • 信号专题练习

    一、基本语法

    #include <unistd.h>
    #include <stdio.h>
    #include <signal.h>
    
    void func(int sig)                      // 信号处理器程序
    {
            printf("capture signal %d
    ", sig);
    }
    
    void testSigaction()    
    {
            /* 设置sigaction()系统调用中的act参数 */
            struct sigaction act;    
            act.sa_handler= func;
            act.sa_flags = SA_RESETHAND;
            sigaction(SIGINT, &act, NULL);
            kill(getpid(), SIGINT);    
            while(1);
    }
    
    
    int main()
    {
            testSigaction();
            return 0;
    }
    

      

    二、使用SA_SIGINFO标志来完成一个程序。

    #include <stdio.h>
    #include <signal.h>
    #include <unistd.h>
    
    void func(int sig, siginfo_t *info, void *args)
    {
            printf("===== Handle signal %d =====
    ", sig);
            printf("Signal number      :%d
    ", info->si_signo);
            printf("Send Process's PID :%d
    ", info->si_pid);
            printf("Send User's UID    :%d
    ", info->si_uid);
            printf("============================
    ");
    }
    
    
    void testSigaction()
    {
            struct sigaction act;
            act.sa_sigaction = func; // 相比于sa_handler,此能够提供给func一些信号的附加信息
            act.sa_flags = SA_SIGINFO;
            sigemptyset(&act.sa_mask);
            int iRet = sigaction(SIGINT, &act, NULL);
            if (iRet == -1) {
                    perror("fail sigaction");
                    return;
            }
            while(1);
    }
    
    int main()
    {
            testSigaction();
            return 0;
    }
    

      

    三、编写一个程序,要求包含信号集、信号掩码、阻塞信号的运用。

    #include <stdio.h>
    #include <signal.h>
    #include <unistd.h>
    
    /* 接受SIGINT信号时,由于其遭到阻塞,故不会执行该信号处理函数 */
    void func(int sig)
    {
            printf("===== Handle signal %d =====
    ", sig);
    }
    
    
    void testSignalBlock()
    {
            sigset_t sigSet, oldSet;                // 信号集
            sigemptyset(&sigSet);                   // 初始化一个未包含任何成员的信号集
            sigaddset(&sigSet, SIGINT);             // 将信号SIGINT添加到信号集sigSet中
            if (sigismember(&sigSet, SIGINT)) {     // 测试SIGINT是否是信号集sigSet的成员
                    printf("SIGINT is blocked!
    ");
            }
            sigprocmask(SIG_SETMASK, &sigSet, &oldSet);     // 将sigSet赋给信号掩码,此时该阻塞才生效
    
            signal(SIGINT, func);                   // signal()系统调用
            while(1);
    }
    
    int main()
    {
            testSignalBlock();
            return 0;
    }
    

      

  • 相关阅读:
    Flink读取Kafka数据,进行汇总
    Flink集成到CDH上,并运行一个例子
    CDH6.2安装配置第三篇:前台页面配置讲解
    LINUX之ntp时间同步服务配置
    Dubbo+Zookeeper(一)Zookeeper初识
    SpringCloud(五)Zuul网关与分布式配置中心
    SpringCloud(四)Hystrix熔断器
    SpringCloud(三)Ribbon与Feign
    SpringCloud(二)服务注册与发现
    多线程与高并发(六) Lock
  • 原文地址:https://www.cnblogs.com/xzxl/p/8586609.html
Copyright © 2011-2022 走看看