zoukankan      html  css  js  c++  java
  • sigaction函数解析

    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_flag是一个选项,主要理解两个

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

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

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

    例子:

    include

    include

    include

    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清零后可能会造成信号丢失!

  • 相关阅读:
    Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
    IDEA配置Tomcat
    Tomcat【介绍Tomcat、结构目录、虚拟目录、临时域名、虚拟主机、体系结构】
    Mysql免安装版配置【图文版和文字版】
    JDBC第四篇--【数据库连接池、DbUtils框架、分页】
    JDBC第三篇--【事务、元数据、改造JDBC工具类】
    JDBC第二篇--【PreparedStatment、批处理、处理二进制、自动主键、调用存储过程、函数】
    JDBC第一篇--【介绍JDBC、使用JDBC连接数据库、简单的工具类】
    DTD
    第五周项目2-对象作为数据成员
  • 原文地址:https://www.cnblogs.com/lidabo/p/14554828.html
Copyright © 2011-2022 走看看