zoukankan      html  css  js  c++  java
  • linux 信号处理 四 (sigaction参数说明)

    sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。

    他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)

    给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact

    int sigaction(int signo,const struct sigaction *restrict act,

                  struct sigaction *restrict oact);

    第二、第三个参数为,sigaction结构类型定义如下:

    struct sigaction{
      void (*sa_handler)(int);
       sigset_t sa_mask;
      int sa_flag;
      void (*sa_sigaction)(int,siginfo_t *,void *);
    };

    sa_handler:字段包含一个信号捕捉函数的地址

    sa_mask:字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加进进程的信号屏蔽字中。

        即执行信号处理函数期间,阻塞信号屏蔽字中的信号,执行结束后再处理这期间发生的信号(sa_mask集中的信号)。注:阻塞的意思是延迟相应信号

    sa_flag :是一个选项,注意:这个选项只与sigaction函数注册的信号有关联,与sa_mask中的信号无任何关系。

    SA_INTERRUPT 由此信号中断的系统调用不会自动重启
    SA_RESTART 由此信号中断的系统调用会自动重启

    SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针

    SA_NODEFER 一般情况下,当信号处理函数运行时,内核将阻塞(sigaction函数注册时的信号)。但是如果设置了SA_NODEFER标记, 那么在该信号处理函      数运行时,内核将不会阻塞该信号。

    SA_RESETHAND  当调用信号处理函数时或信号处理函数结束后,将信号的处理设置为系统默认值。 

    最后一个参数是一个替代的信号处理程序,当设置SA_SIGINFO时才会用他。

    例子:

    #include <stdio.h>
    #include <signal.h>
    #include <unistd.h>
    
    void show_handler(int sig)
    {
        printf("I got signal %d
    ", sig);
        int i;
        for(i = 0; i < 5; i++) 
        {
            printf("i = %d
    ", i);
            sleep(1);
        }
    }
    
    int main(void)
    {
        int i = 0;
        struct sigaction act, oldact;
        act.sa_handler = show_handler;
        sigaddset(&act.sa_mask, SIGQUIT); //见注(1)
        act.sa_flags = SA_RESETHAND | SA_NODEFER; //见注(2)
        //act.sa_flags = 0; //见注(3)
    
        sigaction(SIGINT, &act, &oldact);
        while(1) 
        {
            sleep(1);
            printf("sleeping %d
    ", i);
            i++;
        }
    }

    注:

    (1)    如果在信号SIGINT(Ctrl + c)的信号处理函数show_handler执行过程中,本进程收到信号SIGQUIT(Crt+),将阻塞该信号,直到show_handler执行结束才会处理信号SIGQUIT。


    (2)    SA_NODEFER       一般情况下, 当信号处理函数运行时,内核将阻塞<该给定信号 -- SIGINT>。但是如果设置了SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号。 SA_NODEFER是这个标记的正式的POSIX名字(还有一个名字SA_NOMASK,为了软件的可移植性,一般不用这个名字)    
           SA_RESETHAND    当调用信号处理函数时,将信号的处理函数重置为缺省值。 SA_RESETHAND是这个标记的正式的POSIX名字(还有一个名字SA_ONESHOT,为了软件的可移植性,一般不用这个名字)   


    (3)    如果不需要重置该给定信号的处理函数为缺省值;并且不需要阻塞该给定信号(无须设置sa_flags标志),那么必须将sa_flags清零,否则运行将会产生段错误。但是sa_flags清零后可能会造成信号丢失!

    http://webcache.googleusercontent.com/search?q=cache:B2HsD1Zf2f8J:hi.baidu.com/operationsystem/blog/item/bb215411f4dc61f4c2ce79e6.html/cmtid/c150423c8b8feae13d6d97b0+sigaction&cd=1&hl=zh-CN&ct=clnk

  • 相关阅读:
    Maven No sources to compile
    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-assembly-plugin:2.4:single (make-assembly) on project hive-udf: Error reading assemblies: No assembly descriptors found. -> [Help 1]
    在使用maven时出现Invalid packaging for parent pom.xml, must be _pom_ but is _xxx类问题的处理
    blogs
    resouces
    Natural Language Processing with Python 1.1
    Fundamentals of Python: Preface
    移动互联网
    时间都去哪儿了
    凝思磐石安全操作系统官方版 下载
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/4115431.html
Copyright © 2011-2022 走看看