信号

涉及主要函数

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;//信号号

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

}

原文地址:https://www.cnblogs.com/qingducx/p/4651544.html