对linux中signal()函数的理解

     信号可以看做程序运行期间的一种软件中断,信号是异步的,也就是说对于进程运行而言信号的发生是随机的,每当有信号产生时,进程会立即处理该信号。

     人们可以通过键盘组合来发送特定的信号,比较重要的有:

    SIGINT   2    采用ctrl+c产生该信号 
    SIGQUIT  3   
采用ctrl+\产生该信号 
    SIGKILL  9   
采用kill -9产生该信号 

    kill -l 表示查看当前系统所支持的所有信号

  信号产生后,对于信号的处理有三种方式:

1)默认处理
     -
绝大多数信号的默认处理方式都是终止进程
2)忽略处理
3)自定义处理

对哪种信号进行哪种特定的处理,这时就要用到signal()函数

signal函数定义:

void (*signal(int signum,void(*handler)(int)))(int)

这么一长串有点吓人,其实慢慢分析

首先  void(*p)(int  )表示p是一个函数指针,参数是int型,返回是void型

对于void (*signal())(int),   signal)表示的是signal函数的返回值,意思是signal函数的返回值是一个函数指针,参数是int型,返回是void型

而上面一长串的signal函数只不过是将signal函数具体的形参写了出来,意思就是signal这个函数,有两个形参,一个是int型,一个是函数指针型,这个函数指针参数为int返回为void,而它运行完之后,返回的也是一个函数指针,参数为int,返回是void,这个时候就有重大发现,这signal的第二个参数和它的返回值是一样样的形式啊,其实重要的点就在这里,我认为注意是我认为啊,要是错了各位大牛请指正别打我……这个signal()函数只不过起一个传递的作用,只要它运行正确,它运行返回的结果其实就是第二个参数里的函数指针,只不过把第一个参数int当做第二个参数函数指针的int型形参。

有点乱有个例子

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void fa(int signo){
	printf("捕获到了信号%d\n",signo);
}
int main(){

signal(SIGIN,fa);
<span style="font-family: Arial, Helvetica, sans-serif;">while(1);</span>
<span style="font-family: Arial, Helvetica, sans-serif;">return 0;</span>
}
利用ctrl+c发出SINGIN信号之后,signal函数开始执行,咋执行不管,反正最终返回的是函数指针指向fa函数,同时将SINGIN作为fa()函数的signo参数,这样程序在执行完singal()函数之后就开始执行fa函数了,这就是我认为的signal函数只起一个传递的作用。

上面的例子讲解的都是第三种处理方式:自定义处理,就是产生指定的信号以后,你自己定义一个让它执行的函数,而对于忽略处理和默认处理就很简单,分别为
:signal(int  signum,SIG_IGN ),signal(int  signum,SIG_DFL ),其实这里的SIG_IGN和SIG_DFL也代表两个函数指针,前者表示,当检测到signum信号来到,忽略它,后者则表示当检测到signum信号时,程序立刻终止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值