zoukankan      html  css  js  c++  java
  • 实时信号和非实时信号

    #include <assert.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <unistd.h>
    
    void myHandler(int num)
    {
        int ret = 0;
        
        if (SIGUSR1 == num)
        {
            sigset_t set;
            ret = sigemptyset(&set);
            assert(!(-1 == ret));
            ret = sigaddset(&set, SIGINT);
            assert(!(-1 == ret));
            ret = sigaddset(&set, SIGRTMIN);
            assert(!(-1 == ret));
            ret = sigprocmask(SIG_UNBLOCK, &set, NULL);
            assert(!(-1 == ret));
            printf("解除阻塞 recv sig num: %d
    ", num);
        }
        else if (num == SIGINT || num == SIGRTMIN)
        {
            printf("recv sig num: %d
    ", num);
        }
        else
        {
            printf(" 其他信号recv sig num: %d
    ", num);
        }
    }
    
    int main(void)
    {
        pid_t pid;
        int ret = 0;
        // 设置回调函数
        struct sigaction act;
        act.sa_handler = myHandler;
        act.sa_flags = SA_SIGINFO;
        // 注册非实时信号的处理函数
        ret = sigaction(SIGINT, &act, NULL);
        assert(!(-1 == ret));
        // 注册实时信号的处理函数
        ret = sigaction(SIGRTMIN, &act, NULL);
        assert(!(-1 == ret));
        // 注册用户自定义信号
        ret = sigaction(SIGUSR1, &act, NULL);
        assert(!(-1 == ret));
        
        // 把 SIGINT  SIGRTMIN 军添加到阻塞状态字中
        sigset_t set;
        ret = sigemptyset(&set);
        assert(!(-1 == ret));
        ret = sigaddset(&set, SIGINT);
        assert(!(-1 == ret));
        ret = sigaddset(&set, SIGRTMIN);
        assert(!(-1 == ret));
        ret = sigprocmask(SIG_BLOCK, &set, NULL);
        assert(!(-1 == ret));
        
        pid = fork();
        assert(!(-1 == ret));
        if (0 == pid)
        {
            union sigval value;
            value.sival_int = 10;
            int i = 0;
            // 发三次不稳定信号
            for (i = 0; i < 3; i++)
            {
                ret = sigqueue(getppid(), SIGINT, value);
                assert(!(-1 == ret));
                printf("发送不可靠信号 ok
    ");
            }
            
            // 发三次稳定信号
            value.sival_int = 20;
            for (i = 0; i < 3; i++)
            {
                ret = sigqueue(getppid(), SIGRTMIN, value);
                assert(!(-1 == ret));
                printf("发送可靠信号ok
    ");
            }
            // 向父进程发送 SIGUSR1 解除阻塞
            ret = kill(getppid(), SIGUSR1);
            assert(!(-1 == ret));
        }
        while (1)
        {
            sleep(1);
        }
        return 0;
    }
  • 相关阅读:
    PHP设计模式——观察者模式
    TRIZ系列-创新原理-34-抛弃和再生部件原理
    玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo
    高速排序算法C++实现
    crm操作报价单实体
    CSS3 网格布局(grid-layout)基础知识
    shadowOffset 具体解释
    [软件人生]关于此次抄袭事件的一个对话
    SpringMVC接收复杂集合对象(参数)代码示例
    Spring MVC同时接收一个对象与List集合对象
  • 原文地址:https://www.cnblogs.com/bangiao/p/6498715.html
Copyright © 2011-2022 走看看