signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析
来源:互联网 发布:新闻和网络宣传工作 编辑:程序博客网 时间:2024/05/29 08:33
http://www.cnblogs.com/liulipeng/p/3470753.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()函数,实现在主程序中安一定的时间间隔运行另一个进程
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()就会发出SIGALRM信号,只要一有SIGALRM信号,signal()就捕捉,然后去执行handler()函数。
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 5static 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)分析
- void (*signal(int signo, void (*fun(int))))(int)
- 设置信号信号处理函数void (*signal (int signo ,void (*fun)(int )))(int)
- C专家编程—分析signal函数的原型声明{void (*signal(int sig,void (*func)(int)))(int)}(2)
- C专家编程—分析signal函数的原型声明{void (*signal(int sig,void (*func)(int)))(int)}(2)
- void (*signal(int signo, void (*func) (int))) (int) 理解
- void (*signal (int signo, void (*func)(int))) (int);
- signal函数:void (*signal(int,void(*)(int)))(int);
- 关于c语言声明 void (*signal(int sig, void(*func)(int)))(int)的理解
- 理解(*(void(*)())0)()和void (*signal(int, void(*)(int)))(int)
- signal函数理解或者void (*signal(int signum,void(*handler)(int)))(int)理解
- signal函数理解或者void (*signal(int signum,void(*handler)(int)))(int)理解
- void (*signal(int sig, void (*func) (int))) (int)理解
- void (*signal(int sig, void (*func) (int))) (int)理解
- 对void (*signal(int , void (*) (int))) (int) 理解
- 简化void(*signal(int signum, void(*handler)(int)))(int)
- c语言声明 void (*signal(int sig, void(*func)(int)))(int)
- 由(void (*)())0;到void ( *signal( int sig, void (* handler)( int ))) ( int );
- POJ 1845 数学问题
- Navicat for MySQL 有哪些常用功能
- Ipad 下拍照打不开解决
- JVM(1)JVM内存模型
- [leetcode] 326. Power of Three
- signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析
- ByteBuffer用法小结
- 文章标题
- CALayer的属性、接口总结
- VSync Count 垂直同步
- EFI安装Win7再补遗
- TerarkDB 数据库的性能报告与技术解析
- socket编程原理
- caffe的python接口封装原理与解析