signal函数

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

#define SIG_ERR  (void (*)())-1
#define SIG_DFL   (void (*)())0
#define SIG_IGN   (void (*)())1
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

static void sig_usr(int);

int main(int argc, char *argv[])
{
    if (signal(SIGUSR1, sig_usr) == SIG_ERR)
        printf("can't catch SIGUSR1\n");
    if (signal(SIGUSR2, sig_usr) == SIG_ERR)
        printf("can't catch SIGUSR2\n");
    while (1)
        pause();

    return 0;
}

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

 

posted @ 2014-11-04 10:57  yyxayz  阅读(482)  评论(0编辑  收藏  举报