Chinaunix首页 | 论坛 | 博客
  • 博客访问: 54547
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 121
  • 用 户 组: 普通用户
  • 注册时间: 2015-02-07 12:34
文章分类

全部博文(12)

文章存档

2015年(12)

我的朋友

分类: LINUX

2015-08-02 15:03:55

    这两天遇到一些声明比较复杂的函数,比如signal函数,那我们先简单说说signal函数的用法:(参考《c陷阱与缺陷》)
【signal:几乎所有c语言程序的实现过程中都要用到signal函数,作为捕获不同步的一种方式。我们用户要调用signal函数,可以这样使用,首先在头文件中加入:#include<signal.h>  ,然后我们可以这样调用signal函数:signal(signal type,sighandler_t hander),这里的signal type代表系统头文件#include<signal.h>中某些常量,这些常量用来标识signal函数将要捕获的信号类型;sighander_t hander 是当指定信号发生时,将要加以调用的事件处理函数。signal函数返回的是指向处理函数(即hander)的指针,也就是它返回“一个指向函数的指针”。】
当然,我们今天的目的是函数声明,有关signal函数就到这里,这是“man signal”函数,我们可以看到它的声明:

点击(此处)折叠或打开

  1. #include <signal.h>

  2.        typedef void (*sighandler_t)(int);

  3.        sighandler_t signal(int signum, sighandler_t handler);

看吧,是不是比较难理解,那让我们从hander(事件处理函数)入手,假设我们的事件处理函数是这样的

void hander( int signum)
{
        /*特定的信号处理部分*/
}

参数signum是一个信号值,我们可以先不管,那么我们的 hander 函数可以这样声明:

void hander(int);

但是我们想用一个指向hander函数的指针来代替hander,就假设它为 point ,所以就有*point = hander;那么声明又可以写为:

void (*point)(int);

因为signal函数返回值类型与point的类型一样(即hander的类型),那么signal函数我们就可以这样声明:

void (*signal(arg,hander))(int);   【注意:函数名是一个指向函数的指针,它就是函数入口】

在这里,我们将(arg,hander)传递给signal函数,signal函数经过处理,返回一个函数指针,指针指向的这个函数有一个参数为(int)类型,它的返回值为void 类型,这不就是我们的hander函数吗?对于signal中的arg不再作过多解释,我们将hander 函数“带入”,前面我们已经将hander函数声明为 void (*point)(int); 这儿的point可以在声明时省略,也就是我们的signal函数可以这样声明了:

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

我们也用typedef可以简化上面的声明:

typedef void (*sighander_t )(int) ;
sighander_t signal(int signum,sighander_t hander);

经过这样一个过程,有没有对这个函数声明有些理解呢?



阅读(1797) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~