当前位置: 技术问答>linux和unix
求救。。关于signal
来源: 互联网 发布时间:2017-01-29
本文导语: #include #include #include void my_func(int sign_no) { if(sign_no==SIGINT) ...
#include
#include
#include
void my_func(int sign_no)
{
if(sign_no==SIGINT)
printf("I have get SIGINTn");
else if(sign_no==SIGQUIT)
printf("I have get SIGQUITn");
}
int main()
{
printf("Waiting for signal SIGINT or SIGQUIT n ");
/*注册信号处理函数*/
signal(SIGINT, my_func);
signal(SIGQUIT, my_func);
pause();
exit(0);
}
问题“
signal的原型是:void (*signal(int signo,void (*func)(int))) (int)
那么这两行代码注册信号的代码中signal(SIGINT, my_func);signal(SIGQUIT, my_func)
怎么没有原型中最外层的int型参数。有点困惑。。
#include
#include
void my_func(int sign_no)
{
if(sign_no==SIGINT)
printf("I have get SIGINTn");
else if(sign_no==SIGQUIT)
printf("I have get SIGQUITn");
}
int main()
{
printf("Waiting for signal SIGINT or SIGQUIT n ");
/*注册信号处理函数*/
signal(SIGINT, my_func);
signal(SIGQUIT, my_func);
pause();
exit(0);
}
问题“
signal的原型是:void (*signal(int signo,void (*func)(int))) (int)
那么这两行代码注册信号的代码中signal(SIGINT, my_func);signal(SIGQUIT, my_func)
怎么没有原型中最外层的int型参数。有点困惑。。
|
因为有人发现,对于singal函数,用typedef处理一下,可以写成更简单的方式。
于是有了这个定义,typedef void (*sighandler_t)(int);
那么void (*signal(int signo, void (*func)(int)))(int); 就转换成下面的样子:
sighandler_t signal(int signum, sighandler_t handler);
就是typedef加函数指针。算是typedef的特殊用法,至于为什么这样用,一起等楼下高人解释。我也没明白原理,所以感觉有点“违反直觉”。看这个简单的例子:
于是有了这个定义,typedef void (*sighandler_t)(int);
那么void (*signal(int signo, void (*func)(int)))(int); 就转换成下面的样子:
sighandler_t signal(int signum, sighandler_t handler);
就是typedef加函数指针。算是typedef的特殊用法,至于为什么这样用,一起等楼下高人解释。我也没明白原理,所以感觉有点“违反直觉”。看这个简单的例子:
#include
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int (*calc)(int a, int b);
typedef int (*Func)(int a, int b);
int main(void)
{
int a = 3, b = 4;
Func fc;
calc = add;
printf("%dn", calc(a, b));
fc = sub;
printf("%dn", fc(a,b));
return 0;
}
|
确实,有点晕,分而治之就简单了
#include
void (*signal(int sig, void (*func)(int)))(int);
or in FreeBSD's equivalent but easier to read typedef'd version:
typedef void (*sig_t) (int);
sig_t
signal(int sig, sig_t func);
http://www.freebsd.org/cgi/man.cgi?query=signal&apropos=0&sektion=0&manpath=FreeBSD+8.2-RELEASE&arch=default&format=html
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。