zoukankan      html  css  js  c++  java
  • signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析

    转: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 ”);
    }
    main()
    {
        int i;
        signal(SIGALRM,handler);
        alarm(5);
        for(i=1;i<7;i++){
             printf(“sleep %d ... ”,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 ");
            if (signal(SIGSTOP,sig_usr) == SIG_ERR)
                    printf("can't catch SIGSTOP ");
                   
            signal(SIGALRM,        sig_parse);
            alarm(PARSE_TIMEOUT);
           
            for ( ; ;)
                    pause();
           
    }

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


    void sig_parse()
    {
            printf("received SIGALRM ");       
    //        signal(SIGALRM, sig_parse);
            alarm(PARSE_TIMEOUT);
    }
     
  • 相关阅读:
    HDU 3507 PrintArticle (单调队列优化)
    BZOJ 1911 (特别行动队)
    POJ 3709 K-Anonymous Sequence (单调队列优化)
    邓_php面试【002】——完整版
    邓_正则表达式
    邓_PHP面试2
    邓_PHP面试【001】
    网站大全
    Jquery 获取对象的几种方式介绍
    邓_Jquery测试题
  • 原文地址:https://www.cnblogs.com/liulipeng/p/3470753.html
Copyright © 2011-2022 走看看