转:http://blog.sina.com.cn/s/blog_4850a7880100hnam.html

void (*signal(int signo, void (*fun(int))))(int)

int (*p)();
这是一个函数指针, p所指向的函数是一个不带任何参数, 并且返回值为int的一个函数.
int (*fun())();
这个式子与上面式子的区别在于用fun()代替了p,而fun()是一个函数,所以说就可以看成是fun()这个函数执行之后,它的返回值是一个函数指针,这个函数指针(其实就是上面的p)所指向的函数是一个不带任何参数,并且返回值为int的一个函数.所以说对于

============================================================================
void (*signal(int signo, void (*fun)(int)))(int);
就可以看成是signal()函数(它自己是带两个参数,一个为整型,一个为函数指针的函数),
而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带一个整型参数,并且返回值为void的一个函数.
signal函数返回的其实是指向以前的信号处理程序的指针,

================================================================

void (*signal(int signo, void (*fun(int))))(int)
signal信号处理函数原型,signal有两个参数,一个整形,一个是有一个整形参数的func函数返回的void类型,这个函数返回一个指针,指向
可以咯有一个int参数的函数并且返回一个void类型的值,这个函数太复杂,本身没有意义,一般都是用typedef之后的简单的信号处理函数

================================================================

利用signal()函数与alarm()函数,实现在主程序中安一定的时间间隔运行另一个进程

先说一下signal()这个函数.
unix信号signal定义
#include <signal.h>
void (*signal(int signo,void(*fun)(int)))(int)

说明:1 返回值是一个 void (*)(int)类型的函数指针
        
2 signo是信号名
        
3 第二个参数为该信号的处理函数指针,类型为void (*)(int)
          SIG_IGN
忽略参数signum指定的信号。
       SIG_DFL
将参数signum
指定的信号重设为核心预设的信号处理方式。
        
4 函数返回:成功则返回以前的信号处理配置函数指针,出错返回SIG_ERR
        
5 SIG_ERR原形为 #define SIG_ERR (void (*)())-1

 
看一个例子!
#include <signal.h>
#include<stdio.h>
 

void handler() {
    printf(“hello\n”);
}
main()
{
    int i;
   
signal(SIGALRM,handler);
    alarm(5);
   
for(i=1;i<7;i++){
    
  
 printf(“sleep %d ...\n”,i);
    
  
 sleep(1);
    }
}

   
alarm(5)会在它的参数指定的时间到达的时候发出一个SIGALRM信号,也就是5秒之后发出一个SIGALRM,然后signal(SIGALRM,handler)捕捉到了这个信号就去执行它的第二个参数指定的函数,这里是handler()函数。

无论程序执行到哪一部分,只要时间一到,alarm()就会发出SIGALRM信号,只要一有SIGALRM信号,signal()就捕捉,然后去执行handler()函数

所以执行结果应该如下:

sleep 1 ...
sleep 2 ...
sleep 3 ...
sleep 4 ...
sleep 5 ...
hello
sleep 6 ...

 
下面还有个例子,大家自己去琢磨吧!
#include <unistd.h>
#include <signal.h>
#include<stdio.h>
#include<stdlib.h>

#define     
  PARSE_TIMEOUT 
     
     
  5

static void sig_usr(int);
void sig_parse();

int main()
{
     
  if (signal(SIGUSR1,sig_usr) == SIG_ERR)
     
     
    printf("can't catch
SIGUSR1");
     
  if (signal(SIGUSR2,sig_usr) == SIG_ERR)
     
     
    printf("can't catch
SIGUSR12");
     
  if (signal(SIGKILL,sig_usr) == SIG_ERR)
     
     
    printf("can't catch
SIGKILL\n");
     
  if (signal(SIGSTOP,sig_usr) == SIG_ERR)
     
     
    printf("can't catch
SIGSTOP\n");
     
     
   
     
  signal(SIGALRM, 
     
sig_parse);
     
  alarm(PARSE_TIMEOUT);
     
 
     
  for ( ; ;)
     
     
    pause();
     
 
}

static void sig_usr(int signo)
{
     
  if(signo == SIGUSR1)
     
     
    printf("received
SIGUSR1\n");
     
  else if(signo == SIGUSR2)
     
     
    printf("received
SIGUSR2\n");
     
  else if(signo == SIGKILL)
     
     
    printf("received
SIGKILL\n");   
   
     
  else if(signo == SIGSTOP)
     
     
    printf("received
SIGSTOP\n");   
   
     
  else
     
     
    printf("recevied signal
%d\n",signo);
     
  return;
}

void sig_parse()
{
     
  printf("received SIGALRM\n"); 
     
//     
  signal(SIGALRM, sig_parse);
     
  alarm(PARSE_TIMEOUT);
}

 

signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析的更多相关文章

  1. 如何理解signal函数声明

    Signal函数用起来其实很简单,但是回头看看他的声明,相信会有很多人表示费解.自己也在这个问题中纠结了好几年了,今天终于弄明白,很是兴奋,一起分享一下. 先看函数原型:void (*signal(i ...

  2. Linux 信号(二)—— signal 函数

    弗洛伊德认为:要解决这些苦恼,当事人就要通过回忆并理解自己早期的童年经历,来获得对潜意识冲突的顿悟.弗洛伊德的疗法被称为“精神分析” (psychoanalysis),在 20 世纪的很长一段时间被心 ...

  3. 信号之signal函数

    UNIX系统的信号机制最简单的接口是signal函数.signal函数的功能:为指定的信号安装一个新的信号处理函数. #include <signal.h> void (*signal(i ...

  4. Signal ()函数详细介绍 Linux函数

    http://blog.csdn.net/ta893115871/article/details/7475095 Signal ()函数详细介绍 Linux函数 signal()函数理解 在<s ...

  5. Signal ()函数详细介绍 Linux函数(转)

    Signal ()函数详细介绍 Linux函数 收藏人:紫火神兵     2012-09-27 | 阅:5659  转:22    |   来源   |  分享               signa ...

  6. 三十、Linux 进程与信号——信号的概念及 signal 函数

    30.1 信号的基本概念 信号(signal)机制是Linux 系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化 信号是软件中断 信号是异步事件 ...

  7. UNIX高级环境编程(13)信号 - 概念、signal函数、可重入函数

    信号就是软中断. 信号提供了异步处理事件的一种方式.例如,用户在终端按下结束进程键,使一个进程提前终止.   1 信号的概念 每一个信号都有一个名字,它们的名字都以SIG打头.例如,每当进程调用了ab ...

  8. linux signal函数遇到的问题

    1.关于signal函数的定义 signal最开始的原型是这: void (*signal(int signo, void (*func)(int)))(int);看过下面两行,了解到上面这一行是这个 ...

  9. 异步处理方式之信号(一):基础知识和signal函数说明

    文章目录 1. 引言 2. 信号的概念 2.1 信号操作之忽略信号 2.2 信号操作之捕捉信号 2.3 信号操作之执行系统默认操作 2.4 常见的信号 3. 函数signal 3.1 signal函数 ...

随机推荐

  1. 更新卡片的zIndex

    问题描述 屏幕上有若干张互相重叠的卡片,用户每点击一张卡片,就要把这张卡片的移到最上面,也就是把它的zIndex置为最大值.应该如何操作每个卡片的zIndex才能实现? 实现方案一 定义一个全局变量g ...

  2. Java用JSONObject-lib来解析json串

    直接贴代码:(所需jar包:json-lib.jar,可能会关联一些其它的jar包,请自行搜索.) import java.util.ArrayList; import java.util.HashM ...

  3. 一个MVC4 下的验证码用法

    先看一个核心验证码类(不用在意实现过程,直接copy就行),下面包含了两种验证码图片(原理一样),代码如下: using System; using System.Collections.Generi ...

  4. 【MySQL】MySQL的约束

    在开始之前,笔者介绍一下笔者使用的数据库版本为5.7.所有的关系型数据库都支持对数据表使用约束,通过约束可以更好的保证数据表里数据的完整性.约束是在表上强制执行的数据校验,约束主要用于保证数据库里数据 ...

  5. 【Oracle】Oracle 的过程化SQL(PLSQL)中NULL值的处理

    下面是NULL的几个注意点: 1.NULL值既不是空格也不是0. 2.给表插入值的时候,如果没有给列指定列值,则默认为NULL. 3.当算术表达式里包含NULL值时,其计算结果也是NULL值. 这时候 ...

  6. 基于matplotlib的数据可视化 - 等高线 contour 与 contourf

    contour 与contourf 是绘制等高线的利器. contour  - 绘制等高线 contourf - 填充等高线 两个的返回值值是一样的(return values are the sam ...

  7. atom介绍

    在公司微信群,看到activate-power-mode插件的效果,很绚丽,才知道github自己出了一个自己的编辑器atom 官网地址 https://atom.io 官网看了下,atom编辑器的特 ...

  8. hadoop相关内容

    数据库导出到hadoop http://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1212liuqy/ http://www. ...

  9. STL 的string类怎么啦?

    前言   上个周末在和我的同学爬香山闲聊时,同学说到STL中的string类曾经让他备受折磨,几年前他开发一个系统前对string类还比较清楚,然后随着程序的复杂度的加深,到了后期,他几乎对strin ...

  10. PCM、G.729等常用VoIP编码的理论带宽计算

    可能通信背景的同学,一提到PCM编码,脑海里都能跳出来一个数值64K. 一.64KB还是64Kb? 64Kb! 二.哪里来的64Kb? CCITT规定抽样率为每秒8000KHz,每抽样值编8位码,所以 ...