分析signal函数的原型声明void (*signal(int sig,void (*func)(int)))(int)

在ANSI标准中,signal()的声明如下:
     void (*signal(int sig,void (*func)(int)))(int),此函数是linux中信号处理函数的原型,由于语法晦涩,很荣幸的也出现在了《C陷阱与缺陷中》,理解的难点在于void ( *signal(xxx) )(int),这里与我们平常看到的void ( *p )(int) 函数指针的写法有差异,关键点在于要把看成*signal(xxx) 整体;


signal是一个函数:
     1.它返回一个函数指针void (*p) (int)

     2.它的两个参数是一个是int和一个函数指针void (*p) (int)


下面用typedef进行简化:
      typedef void(*ptr_to_func)(int);
      ptr_to_func signal(int,ptr_to_func);

这样看起来就很好理解啦


网上的一个例子:

#include <stdio.h>
enum { RED, GREEN, BLUE };
void OutputSignal(int sig)
{
   printf("The signal you /'ve input is: ");
   switch(sig)
   {
        case RED:
            puts("RED!");
            break;
        case GREEN:
            puts("GREEN!");
            break;
        case BLUE:
            puts("BLUE!");
            break;
    }
}
void ( *signal( int sig, void (*func)(int) ) ) (int)
{
        puts("Hello, world!");
        func(sig);
        return func;
}
int main(void)
{
    (*signal(GREEN, &OutputSignal))(RED);
    return 0;
}

Output:

     Hello, world!

     The signal you 've input is: GREEN!

     The signal you 've input is: RED!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值