首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

。关于signal

2012-02-02 
求救。。关于signal#include signal.h#include stdio.h#include stdlib.hvoid my_func(int sign_no){i

求救。。关于signal
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
   
void my_func(int sign_no)
{
  if(sign_no==SIGINT)
  printf("I have get SIGINT\n");
  else if(sign_no==SIGQUIT)
  printf("I have get SIGQUIT\n");
}
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的特殊用法,至于为什么这样用,一起等楼下高人解释。我也没明白原理,所以感觉有点“违反直觉”。看这个简单的例子:

C/C++ code
#include <stdio.h>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("%d\n", calc(a, b));        fc = sub;        printf("%d\n", fc(a,b));        return 0;}
[解决办法]
探讨

顶4楼,这东西看着晕乎乎的。

热点排行