让你费解的函数原型:Linux下的signa函数

本文详细解析了C语言中signal函数的用法,包括函数的声明、参数、返回值及函数指针的概念,帮助读者更好地掌握信号处理机制。

signal函数用于向系统注册处理某一信号的函数,说白了,就是告诉系统:当某个信号发生了,执行这个函数。当signal被调用时,它返回调用前处理同意信号的函数的指针。

在signal.h头文件中,它的声明如下:

void (*signal (int sig_num, void (*handler)(int))) (int);

还有这样的函数定义?学C语言的时候好像没听说过?!现在就让我们一步一步、一层一层地剥掉它的小括号。

前面说到,signal函数返回值是函数指针:

void (*fp) (int)      //pointer to a function

对应到上面的函数原型,这里的 fp 相当于

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

到这里,我们找出了函数的返回值类型:函数名signal,参数列表包括一个整型值和一个函数指针。又是一个函数指针,你发现了吗,这个函数指针:

void (*handler)(int) 
和上面的那个函数指针其实是一样的,其实这不难理解,因为signal函数的返回值就是信号处理函数的地址。

函数指针是一类特殊的指针,它存储的是函数的入口地址,也就是说,通过这个指针,你可以调用函数。

函数指针对其可以指向的函数的签名和返回值类型有严格的要求,否则,无法将某个函数地址赋给一个函数指针,举个例子。

//定义一个可以指向返回值为void,参数为两个int型的函数指针,   
//注意这里的*和()的位置,很重要   
void (*fp)(int, int)

如果某个函数的原型是void function(int a, int b),则可以进行如下赋值和调用:

fp = function;  //函数名不接括号和参数即表示此函数的地址   
function (5,6);  
fp(5,6);       //这与上面的function(5,6)调用具有同样的效果

还有一个很大的不同,普通的指针可以进行强制类型转换,但是函数指针不可以

到底函数指针有什么用途呢,典型的用处是动态调用具有相同签名和返回值的不同函数,即在不同的条件下,调用不同的函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值