zoukankan      html  css  js  c++  java
  • 信号

    涉及主要函数

    signal  sigaction  alarm  pause  sigpromask  sigemptyset  sigaddset  sigpending  sigsetjmp  siglongjmp  setitimer

    int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

    根据参数signum可以指定SIGKILL和SIGSTOP以外的所有信号,sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。
    int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));

    触发SIGALRM信号

    int which:

          ITIMER_REAL : 以系统真实的时间来计算,它送出SIGALRM信号。  

          ITIMER_VIRTUAL : -以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。  

          ITIMER_PROF : 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。

     const struct itimerval *value:

          指定间隔时间

     sttuct itimerval *ovalue:

          返回上一次定时器的间隔时间,如果不关心该值可设为NULL。

    涉及主要结构体

    struct sigaction

    {

      void (*sa_handler)(int);            //类似signal的信号处理函数

      void (*sa_sigaction)(int,siginfo_t *,void *);  //更加详细的信号处理函数

      sigset_t sa_mask;               //信号集合

      int sa_flags;                  //信号处理行为

      void (*sa_restorer)(void);             //过时的不需要在使用

    }

      int sa_flags:

        SA_RESTART:使被信号打断的系统调用自动重新发起。

        SA_NOCLDSTOP:使父进程在它的子进程暂停或继续运行时不会收到 SIGCHLD 信号。

        SA_NOCLDWAIT:使父进程在它的子进程退出时不会收到 SIGCHLD 信号,这时子进程如果退出也不会成为僵尸进程。

        SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。

        SA_RESETHAND:信号处理之后重新设置为默认的处理方式。

        SA_SIGINFO:使用 sa_sigaction 成员而不是 sa_handler 作为信号处理函数。

      sigset_t sa_mask:

        信号集合

        配合函数  sigpromask  sigemptyset  sigaddset

        sigemptyset(&sa.sa_mask);//初始化信号集合

        sigpromask(SIG_UNBLOCK,&sa.sa_mask,&oldset);//取消阻塞信号 将原来的结果存放在oldset中  当程序结束是还原

          SIG_BLOCK:增加一个信号集合到当前进程的阻塞集合之中.
          SIG_UNBLOCK:从当前的阻塞集合之中删除一个信号集合.
          SIG_SETMASK:将当前的信号集合设置为信号阻塞集合.

        sigaddset(&sa.sa_mask,SIGALRM);//在集合中添加信号

    struct itimerval

    {

      struct timeval it_interval;   //间隔时间

      struct timeval it_value;    //定时时间

    }

    struct timeval

    {

      long tv_sec;//秒

      long tv_usec;//微妙

    }

    siginfo_t  //这也是个结构体

    {

      int si_code;//信号来源(比如user kernel)

      int si_signo;//信号号

      .........还有好多

    }

  • 相关阅读:
    15、常量指针和指针常量区别?
    14、strlen和sizeof区别?
    12、变量声明和定义区别?
    10、宏定义和函数和typedef有何区别?
    hdoj--1495--非常可乐(搜索+隐式图)
    hdoj--2579--Dating with girls(2)(搜索+三维标记)
    poj--3630--Phone List(字典树+前缀判断)
    poj--2001--Shortest Prefixes(字典树)
    Huatuo's Medicine
    hdoj--2803--The MAX(水题)
  • 原文地址:https://www.cnblogs.com/qingducx/p/4651544.html
Copyright © 2011-2022 走看看