zoukankan      html  css  js  c++  java
  • 进程间信号的接收和处理 ------ sigaction 的使用

    linux内核会发射一些信号,应用程序可以捕捉信号执行特定函数

    int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);  成功:0;失败:-1,设置errno

    act:传入参数,新的处理方式。oldact:传出参数,旧的处理方式。

    struct sigaction结构体
    
        struct sigaction {
    
          void(*sa_handler)(int);
      sigset_t sa_mask;   int sa_flags; };

    ① sa_handler:指定信号捕捉后的处理函数名(即注册函数)。也可赋值为SIG_IGN表忽略 或 SIG_DFL表执行默认动作

    ② sa_mask: 调用信号回调函数时,所要屏蔽的信号集合(信号屏蔽字)。注意:仅在处理函数被调用期间屏蔽生效,是临时性设置。用sigaddset函数添加需要被捕捉的信号。

    ③ sa_flags:通常设置为0,表使用默认属性:为0的时候,可以屏蔽正在处理的信号(若在处理2号信号时又有2号信号,则此时传来的2号信号会被屏蔽)。

    #include <stdlib.h>
    #include <stdio.h>
    #include <signal.h>
    void func(int signal)
    {
        printf("%d号信号被捕捉。
    ", signal);
    }
    
    int main(void)
    {
    
        struct sigaction act, oldact;
    
        act.sa_handler = func;
    
        act.sa_flags = 0;
    
        sigemptyset(&act.sa_mask);//sa_mask是一个临时信号集,将其清零(初始化I)
    
        sigaddset(&act.sa_mask, SIGQUIT);//将3号信号添加到信号集,即:3号信号就是我们在处理2号信号的时候需要屏蔽的那个信号,也可以添加其他信号,比如20号信号
    
        sigaddset(&act.sa_mask, SIGTSTP);
    
        int s_ret = sigaction(SIGINT, &act, &oldact);
    
        if (0>s_ret)
        {
            perror("sigaction error");
    
            exit(1);
        }
    
        while (1);
    
        return 0;
    
    }
  • 相关阅读:
    如何突破单库性能瓶颈?
    高性能数据库表该如何设计?
    高性能索引该如何设计?(下)
    高性能索引该如何设计?(上)
    MySQL体系结构与存储引擎
    动态ViewPager导航页面
    ViewPager图片轮转带点的
    手动图片横向轮播
    安卓布局中下拉列表框的实现
    安卓中adapter的应用
  • 原文地址:https://www.cnblogs.com/god-of-death/p/10419163.html
Copyright © 2011-2022 走看看