signal函数详细用法

更详细的用法说明可以看:https://www.cnblogs.com/lidabo/p/4581026.html



信号是在软件层次上对中断的一种模拟,所以通常把它称为是软中断


信号和中断的区别

信号与中断的相似点:

(1)采用了相同的异步通信方式;

(2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;

(3)都在处理完毕后返回到原来的断点;

(4)对信号或中断都可进行屏蔽。

 信号与中断的区别:

(1)中断有优先级,而信号没有优先级,所有的信号都是平等的;

(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;

(3)中断响应是及时的,而信号响应通常都有较大的时间延迟。


SIGABRT  进程停止运行 6

SIGINT      终端中断  2

SIGKILL     停止进程(此信号不能被忽略或捕获)

SIGQUIT   终端退出   3



 handler这个函数必须有一个int类型的参数(即接收到的信号代码),它本身的类型是void,

handler也可以是下面两个特殊值:

                              SIG_IGN     屏蔽该信号

                              SIG_DFL     恢复默认行为


/*
       #include <signal.h>
       typedef void (*sighandler_t)(int);
       sighandler_t signal(int signum, sighandler_t handler);
*/

signal的函数原型,这里要注意它的返回值的类型,

它的参数,第一个是信号的编号,也就是具体是哪一个信号,固定的写法,没什么好说的,

第二个参数handler,

1, 赋值SIG_IGN代表忽略信号,

2,或者你可以自己写个信号处理函数,传给它地址,

3,如果你需要修改上面的设置,可以恢复默认SIG_DFL ,


下面是一个自己写的信号处理函数,

说两点,

1,默认自带一个int类型参数,//开始还在找,这个num哪里传进去的,

2,返回类型是void,


   
   
  1. void handler(int num)
  2. {
  3. printf( “recv num:%d \n”, num);
  4. if (num == SIGQUIT)
  5. {
  6. //exit(0);
  7. }
  8. }


下面是signal返回值的应用场景,


   
   
  1. if (signal(SIGINT, handler) == SIG_ERR)
  2. {
  3. perror( "signal err"); //errno
  4. exit( 0);
  5. }
     这是它的返回  typedef void (*sighandler_t)(int);










下面是对 typedef void (*sighandler_t)(int) 的解释:

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
—————————————————————————–
此处由于加了typedef自定义了一个新类型sighandler_t,所以第二行的函数原型看起来顺眼多了,形式跟int func(char c, int i)无异,但是如果看不懂typedef语句,这两句话仍然是噩梦。
要理解typedef,只要记住一句话就差不多了,那就是:typedef在语句中所起的作用只不过是把语句原先定义变量的功能变成了定义类型的功能而已。我们只消看几个例子立即明白。
例如语句 typedef int *apple; 理解它的正确步骤是这样的:先别看typedef,就剩下int *apple; 这个语句再简单不过,就是声明了一个指向整型变量的指针apple (注意:定义只是一种特殊的声明),加上typedef之后就解释成声明了一种指向整型变量指针的类型apple 。
现在,回过来看上面的这个函数原型 typedef void (*sighandler_t)(int),盖住 typedef不看 ,再简单不过,sighandler_t就是一个函数指针,指向的函数接受一个整型参数并返回一个无类型指针 。加上typedef之后sighandler_t就是一种新的类型,就可以像int一样地去用它,不同的是它声明是一种函数指针,这种指针指向的函数接受一个整型参数并返回一个无类型指针 。怎么样?简单吧。
再来做一个更酷的练习,请看:typedef char *(* c[10])(int **p);
去 掉typedef就变成char *(* c[10])(int **p),先不管这个语句有多难看,它一定是声明了一个拥有10个元素的数组c对不对?okay没什么了不起的,只不过这个数组c的元素有点特别,它们都是函数指针,并且它们所指向的这些函数统统都接受一个二级指针然后返回一直指向字符型的指针。加上typedef之后,c就不是一个数组了,而是一种类型了,什么类型现在你能说出来了吧。
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值