sigaction





sigaction

sigaction

信号


  
  
  1. #include <signal.h>
  2. struct sigaction
  3. {
  4. void (*sa_handler)(int); // 要执行信号的函数指针
  5. void (*sa_sigaction)(int, siginfo_t *, void *); // 信号处理函数
  6. sigset_t sa_mask; // 屏蔽的信号集
  7. int sa_flags; // 指定信号的行为
  8. void (*sa_restorer)(void);
  9. };
  10. // 检查或修改与指定信号相关联的处理动作
  11. int sigaction(int signum, struct sigaction *atc, struct sigaction *oldatc)
  12. // 返回值, 成功 0; 失败, -1.

参数 :

  1. sigaction 函数
    ◆ signum:要操作的信号。可以指定SIGKILL 和SIGSTOP 以外的所有信号。
    ◆ act:要设置的对信号的新处理方式。
    ◆ oldact:原来对信号的处理方式。

  2. sigaction 结构体

    • sa_flags : 指定信号行为

      ◆ SA_RESTART:使被信号打断的系统调用自动重新发起。
      ◆ SA_NOCLDSTOP:使父进程在它的子进程暂停或继续运行时不会收到 SIGCHLD 信号。
      ◆ SA_NOCLDWAIT:使父进程在它的子进程退出时不会收到 SIGCHLD 信号,这时子进程如果退出也不会成为僵尸进程。
      ◆ SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。
      ◆ SA_RESETHAND:信号处理之后重新设置为默认的处理方式。
      ◆ SA_SIGINFO:使用 sa_sigaction 成员而不是 sa_handler 作为信号处理函数。

    • sa_handler : 处理信号的函数

  
  
  1. /*************************************************************************
  2. > File Name: t.cpp
  3. > Author: Function_Dou
  4. > Mail:
  5. > Created Time: 2018年03月05日 星期一 16时10分38秒
  6. ************************************************************************/
  7. #include <stdio.h>
  8. #include <signal.h>
  9. #include <stdlib.h>
  10. #include <unistd.h>
  11. #include <setjmp.h>
  12. static jmp_buf jmp;
  13. static void sig_int(int signo)
  14. {
  15. if(signo == SIGINT)
  16. printf("SIGINT\n");
  17. if(signo == SIGALRM)
  18. printf("SIGALRM\n");
  19. if(signo == SIGABRT)
  20. printf("SIGABRT\n");
  21. longjmp(jmp, 1);
  22. }
  23. int main(void)
  24. {
  25. struct sigaction newatc, oldatc;
  26. sigset_t sigset;
  27. sigemptyset(&sigset);
  28. sigfillset(&sigset);
  29. sigaddset(&sigset, SIGINT);
  30. sigaddset(&sigset, SIGALRM);
  31. newatc.sa_mask = sigset;
  32. newatc.sa_handler = sig_int;
  33. // sigaction 类似于signal 函数一样
  34. if(sigaction(SIGINT, &newatc, &oldatc) != 0)
  35. fprintf(stderr, "sigaction(SIGINT) error");
  36. if(setjmp(jmp) == 0)
  37. pause();
  38. exit(0);
  39. }

关于上面程序, setjmp()与longjmp()在信号中也是存在隐患的. 因为longjmp捕捉到一个信号时, 进入信号捕捉函数setjmp()中, 但是当前的信号已经被自动的加入到了进程的信号屏蔽字中
所以也就引入了sigsetjmp()和siglongjmp()函数.

  
  
  1. #include <setjmp.h>
  2. // 直接调用, 返回 0; 从siglongjmp()中返回 val的值.
  3. int sigsetjmp(sigjmp_buf env, int savemask);
  4. void siglongjmp(sigjmp_buf env, int val;

abort()函数

上述程序还有一个信号需要了解. SIGABRT信号.

  
  
  1. #include <stdlib.h>
  2. void abort(void);
  1. 此函数将SIGABRT信号发送给调用进程.
  2. 调用该函数将向主机环境递送一个未成功终止的通知.
  3. abort()函数并不会理会进程对此信号的阻塞和忽略.

让进程捕捉 SIGABRT 信号是为了终止之前由执行所需的清理操作


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值