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)调用具有同样的效果

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

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

让你费解的函数原型:Linux下的signa函数相关推荐

  1. linux getline参数,Linux下的getline函数

    最近在做国嵌的mp3项目,在mp3主控程序中用到了这个函数,挺好使的,在这里记录一下.注意是linux下的,不是C++中的. 函数原型 ssize_t getline(char **lineptr, ...

  2. sleep头文件linux,Linux下的sleep函数 要用的话得包涵什么头文件啊?

    Linux下的sleep函数 要用的话得需要#include sleep把进程的运行状态改为睡眠,将其从系统可执行队列去掉,这样系统就不会调度到该进程,不会分配CPU时间片,同时根据该进程的睡眠时间, ...

  3. linux父进程中显示子进程pid,请教linux下c语言函数fork父进程打印子进程的PID

    请教linux下c语言函数fork父进程打印子进程的PID 关注:296  答案:2  信息版本:手机版 解决时间 2019-01-14 04:55 雨不眠的下 2019-01-13 12:23 用于 ...

  4. linux 下的gettimeofday 函数在windows上的替换方案

    方案一: #include <time.h> #ifdef WIN32 #   include <windows.h> #else #   include <sys/ti ...

  5. [转帖]关于Linux下的icotl函数

    关于Linux下的icotl函数 最近接触android开发,因为有时间所以就关注了下android的源码,在跟踪源码过程中到最后都会遇到icotl函数,虽然在Symbian中曾经遇到过RSocket ...

  6. Linux下的延时函数

    Linux下的延时函数 1.sleep函数 头文件:#include<unistd.h> 功能:执行挂起操作一段时间,以秒为单位 一般形式:unsigned sleep(unsigned ...

  7. linux中c语言kbhit函数用法,linux下kbhit()函数 getch函数。

    对于上面的问题,都用到 linux下的getch函数与kbhit函数. 参考了http://kpld8888.wordpress.com/2007/03/07/linux%E4%B8%8B%E7%9A ...

  8. Linux下无法使用 itoa 函数的解决方法

    起因 在Linux环境下进行C++编程,使用 itoa 函数时出现以下错误: ' itoa ' was not declared in this scope. 翻阅Linux下的 stdlib.h 头 ...

  9. Linux下的memcpy函数

    之前写过一篇关于 memcpy函数面试的文章 几个简单的笔试题 里面的代码使用的是char指针来实现,今天我们来看看Linux下面的memcpy 函数,它的实现上还是有一些巧妙的. void * me ...

最新文章

  1. python的tkinter窗口位置\坐标\大小等知识(自用笔记)
  2. element 方法返回的boolean被当成字符串了_JavaScript 原生对象、属性、方法、事件、事件参数...
  3. 世上的人大都只会“飞鸽传书下载”,没人开发
  4. CANopen | 对象字典OD 03 - 启动CANopen节点的服务数据对象SDO
  5. mysql数据操作-数据库的定义-DLL
  6. __doPostBack()没有定义解决方法(转)
  7. HTML基础——HTML
  8. 市场28款主流同步整流DCDC芯片横向测评预告
  9. sparksql 与flinksql 建表 与 连表记录
  10. 初中英语多词性单词怎么办_初中英语单词按词性分类表
  11. 社保管理系统服务器异常,社保费客户端登录服务器异常
  12. 阿里云 Teambition 网盘亲测体验,秀翻全网!
  13. android 微软桌面,Mirosoft Launcher微软桌面
  14. 阿迪达斯成立全球首个零售学院,并开设“模拟店铺”
  15. 总结下macbook 安装win10 双系统丢驱动的问题
  16. 情不知所起,一“网”而深
  17. java获取秒时间_关于java:以秒为单位获取当前时间
  18. 【杂货铺】金融机构分类
  19. 大数据多样性体现在包括_书摘:复杂的证据定位:电子数据的多样性
  20. C++通过字符串指针打印字符串

热门文章

  1. 关于数据库group by需要注意
  2. html模板编辑器,可视化编辑网站模板
  3. c# mysql fill_C#里sqlDataAdapter.fill(DataSet,String)的用法
  4. int的长度_Java中String长度有限制吗?身边的同事每一个人知道!
  5. python中用def实现自动排序_用 python 实现各种排序算法
  6. 面向对象分析和设计的几个关键步骤_(豁然开朗)《面向对象分析与设计》读书笔记 (4)- 分类...
  7. 对未标记为可安全执行的脚本_Script Debugger for Mac(脚本调试软件)
  8. define 防 php,php中define防止跳墙
  9. matlab 双边沿滤波,图片漫画效果(DoG算子和双边滤波)
  10. 64位php oracle,64位系统无法加载PHP的oracle扩展问题