您的位置:首页 > 其它

使用sigsuspend函数捕捉到信号改变变量的值。

2015-12-17 16:45 281 查看
期待的效果是,

./jump_out_while

^Cinterrupt
^Cinterrupt

^Cinterrupt

^Cinterrupt

^\catch SIGQUIT

然而是确实这样:(知道到为什么只能只是一次调用自己的handler函数。)

<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:./jump_out_while

^Cinterrupt

^\catch SIGQUIT

<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:./jump_out_while

^Cinterrupt

^C<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:./jump_out_while

^Cinterrupt

^C<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:

源代码:

<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:cat -n 10_23.c

     1  #include "apue.h"

     2

     3  volatile sig_atomic_t quitflag;

     4

     5  static void sig_int (int signo)

     6  {

     7          if (signo == SIGINT){

     8                  printf("interrupt\n");

     9          }

    10          else if (signo == SIGQUIT){

    11                  quitflag = 1;

    12                  printf("catch SIGQUIT\n");

    13          }

    14  }

    15

    16  int main()

    17  {

    18          sigset_t new_mask, old_mask, empty_mask;

    19

    20          if (signal(SIGINT,sig_int) == SIG_ERR)

    21                  printf("signal SIGINT error");

    22

    23          if (signal(SIGQUIT,sig_int) == SIG_ERR)

    24                  printf("signal SIGQUIT error");

    25

    26          sigemptyset(&empty_mask);

    27          sigemptyset(&new_mask);

    28          sigaddset(&new_mask,SIGQUIT);

    29

    30          if (sigprocmask(SIG_BLOCK,&new_mask,&old_mask) < 0)

    31                  err_sys("SIG_BLOCK error");

    32

    33          while (quitflag == 0 )

    34                  sigsuspend(&empty_mask);

    35

    36          quitflag = 0;

    37          if (sigprocmask(SIG_SETMASK,&old_mask,NULL) < 0)

    38                  err_sys("sigprocmask SIG_SETMASK error");

    39

    40          exit(0);

    41  }

<bldc:/home/tingbinz/apue.3e/SBSCODE/10>R*_*G:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: