signal函数





signal函数

signal函数

信号


信号是软件中断.

  
  
  1. #include <signal.h>
  2. void (* signal(int signo, void(*func)(int)))(int);
  3. // 看起来确实听恐怖的, 不过就是两个参数, 下面来说说具体的参数
  4. // 错误返回SIG_ERR
  1. signo : 一个信号, 像SIGINT(终止信号), SIGALRM(超时信号)等.
    • SIG_IGN : 像内核表示忽略该信号(SIGKILL, SIGSTOP不能忽略)
    • SIG_DFL : 系统默认的信号动作
    • SIG_ERR : 信号错误
  2. void(*func)(int) : 一个传入int类型, 无返回值的函数
  
  
  1. /*************************************************************************
  2. > File Name: signal__捕捉信号.cpp
  3. > Author: Function_Dou
  4. > Mail:
  5. > Created Time: 2018年02月06日 星期二 19时58分52秒
  6. ************************************************************************/
  7. #include <stdio.h>
  8. #include "apue.h"
  9. #include <signal.h>
  10. static void sig_usr(int);
  11. int main(void)
  12. {
  13. if(signal(SIGUSR1, sig_usr) == SIG_ERR)
  14. err_sys("signal(SIGUSR1) error");
  15. if(signal(SIGINT, sig_usr) == SIG_ERR)
  16. err_sys("signal(SIGINT) error");
  17. // 一直等待, 使进程挂起, 直到捕捉到一个信号为止
  18. for( ; ; )
  19. pause();
  20. exit(0);
  21. }
  22. void sig_usr(int signo)
  23. {
  24. if(signo == SIGUSR1)
  25. printf("SIGUSR1\n");
  26. if(signo == SIGINT)
  27. printf("SIGINT\n");
  28. else
  29. printf("signal error");
  30. }
  31. /* 样例
  32. [root@localhost Signal]# ./a.out &
  33. [2] 10786
  34. [root@localhost Signal]# kill -USR1 10786
  35. SIGUSR1
  36. [root@localhost Signal]# ./a.out
  37. ^CSIGINT
  38. ^CSIGINT
  39. ^CSIGINT
  40. */

当然有一点, 在exec()中信号捕捉是没有意义的, 而在fork()中信号捕捉是有意义的.

可靠与不可靠信号

可靠信号 : 当前的信号数大于处理信号的速度, 未处理的信号会进入队列, 等待处理, 信号不会丢失.
不可靠信号 : 当其信号数大于处理信号的速度, 未处理的信号会忽略, 丢弃. 当发生阻塞时, 产生的信号将丢弃.

可靠信号不会丢弃信号, 全部处理. 不可靠信号会丢弃多余的信号

中断与重入

中断 : 系统遇到紧急处理事件, 暂时中止CPU现在运行的程序, 等待处理完了再返回进行中止的程序.但是, 有些程序中断之后就不能恢复在接着进行.

一个可重入的函数简单来说,就是:可以被中断的函数。

就是说,你可以在这个函数执行的任何时候中断他的运行,在任务调度下去执行另外一段代码而不会出现什么错误。
而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等等,所以他如果被中断的话,可能出现问题,所以这类函数是 不能运行在多任务环境下的。

  1. 什么情况下是不可重入的呢?
    (1)函数体内使用了静态的数据结构, 使用全局变量;
    (2)函数体内调用了malloc()或者free()函数;
    (3)函数体内调用了标准I/O函数。
    • 保证能够中断是安全的函数


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值