Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1273549
  • 博文数量: 160
  • 博客积分: 4132
  • 博客等级: 中校
  • 技术积分: 2086
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-06 21:56
文章分类

全部博文(160)

文章存档

2012年(25)

2011年(120)

2010年(15)

分类: C/C++

2011-08-23 15:18:01


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

  1. void (*signal(int signo, void (*fun(int))))(int)
  2. int (*p)();

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

  1. void (*signal(int signo, void (*fun)(int)))(int);

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

 

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

 

利用signal()函数与alarm()函数,实现在主程序中安一定的时间间隔运行另一个进程
先说一下signal()这个函数.
unix信号signal定义
  1. #include <signal.h>
  2. 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

 
看一个例子!
  1. #include <signal.h>
  2. #include<stdio.h>
  3.  
  4. void handler() {
  5.     printf(“hello\n”);
  6. }
  7. main()
  8. {
  9.     int i;
  10.     signal(SIGALRM,handler);
  11.     alarm(5);
  12.     for(i=1;i<7;i++){
  13.          printf(“sleep %d ...\n”,i);
  14.          sleep(1);
  15.     }
  16. }

    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 ...
 
下面还有个例子,大家自己去琢磨吧!
  1. #include <unistd.h>
  2. #include <signal.h>
  3. #include<stdio.h>
  4. #include<stdlib.h>

  5. #define PARSE_TIMEOUT 5

  6. static void sig_usr(int);
  7. void sig_parse();

  8. int main()
  9. {
  10.         if (signal(SIGUSR1,sig_usr) == SIG_ERR)
  11.                 printf("can't catch SIGUSR1");
  12.         if (signal(SIGUSR2,sig_usr) == SIG_ERR)
  13.                 printf("can't catch SIGUSR12");
  14.         if (signal(SIGKILL,sig_usr) == SIG_ERR)
  15.                 printf("can't catch SIGKILL\n");
  16.         if (signal(SIGSTOP,sig_usr) == SIG_ERR)
  17.                 printf("can't catch SIGSTOP\n");
  18.                
  19.         signal(SIGALRM, sig_parse);
  20.         alarm(PARSE_TIMEOUT);
  21.        
  22.         for ( ; ;)
  23.                 pause();
  24.        
  25. }

  26. static void sig_usr(int signo)
  27. {
  28.         if(signo == SIGUSR1)
  29.                 printf("received SIGUSR1\n");
  30.         else if(signo == SIGUSR2)
  31.                 printf("received SIGUSR2\n");
  32.         else if(signo == SIGKILL)
  33.                 printf("received SIGKILL\n");
  34.         else if(signo == SIGSTOP)
  35.                 printf("received SIGSTOP\n");
  36.         else
  37.                 printf("recevied signal %d\n",signo);
  38.         return;
  39. }


  40. void sig_parse()
  41. {
  42.         printf("received SIGALRM\n");
  43. // signal(SIGALRM, sig_parse);
  44.         alarm(PARSE_TIMEOUT);
  45. }


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