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()函数,实现在主程序中安一定的时间间隔运行另一个进程
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<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 <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)分析的更多相关文章
- 如何理解signal函数声明
Signal函数用起来其实很简单,但是回头看看他的声明,相信会有很多人表示费解.自己也在这个问题中纠结了好几年了,今天终于弄明白,很是兴奋,一起分享一下. 先看函数原型:void (*signal(i ...
- Linux 信号(二)—— signal 函数
弗洛伊德认为:要解决这些苦恼,当事人就要通过回忆并理解自己早期的童年经历,来获得对潜意识冲突的顿悟.弗洛伊德的疗法被称为“精神分析” (psychoanalysis),在 20 世纪的很长一段时间被心 ...
- 信号之signal函数
UNIX系统的信号机制最简单的接口是signal函数.signal函数的功能:为指定的信号安装一个新的信号处理函数. #include <signal.h> void (*signal(i ...
- Signal ()函数详细介绍 Linux函数
http://blog.csdn.net/ta893115871/article/details/7475095 Signal ()函数详细介绍 Linux函数 signal()函数理解 在<s ...
- Signal ()函数详细介绍 Linux函数(转)
Signal ()函数详细介绍 Linux函数 收藏人:紫火神兵 2012-09-27 | 阅:5659 转:22 | 来源 | 分享 signa ...
- 三十、Linux 进程与信号——信号的概念及 signal 函数
30.1 信号的基本概念 信号(signal)机制是Linux 系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化 信号是软件中断 信号是异步事件 ...
- UNIX高级环境编程(13)信号 - 概念、signal函数、可重入函数
信号就是软中断. 信号提供了异步处理事件的一种方式.例如,用户在终端按下结束进程键,使一个进程提前终止. 1 信号的概念 每一个信号都有一个名字,它们的名字都以SIG打头.例如,每当进程调用了ab ...
- linux signal函数遇到的问题
1.关于signal函数的定义 signal最开始的原型是这: void (*signal(int signo, void (*func)(int)))(int);看过下面两行,了解到上面这一行是这个 ...
- 异步处理方式之信号(一):基础知识和signal函数说明
文章目录 1. 引言 2. 信号的概念 2.1 信号操作之忽略信号 2.2 信号操作之捕捉信号 2.3 信号操作之执行系统默认操作 2.4 常见的信号 3. 函数signal 3.1 signal函数 ...
随机推荐
- 使用安全rm
rm命令像一把刀子一样,玩不好会伤到自己.不要觉得自己头脑清醒,人总有犯迷糊的时候. 在.bashrc中设置PATH=/home/me/bin/:$PATH 在自己的bin目录下,添加rm脚本mv - ...
- 使用Idea添加PYTHONPATH的一种方案
工作中我们常常需要更改PYTHONPATH,为项目添加一些依赖. 而不同的项目依赖的PYTHONPATH是不一样的,这就导致项目之间的PYTHONPATH发生混乱. 另一方面,有的电脑上PYTHON2 ...
- Linux按照CPU、内存、磁盘IO、网络性能监测【转载】
本文转载地址:https://my.oschina.net/chape/blog/159640 系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监 ...
- html5界面手机播放mp3
1把这段代码复制到htm5界面. <audio id="audio" src="2.mp3" style="opacity:0" pr ...
- CentOS 7 systemd的坑
一.概述 在从 CentOS 6 迁移到 CentOS 7 的过程中,可能有一些地方需要调整,最显著的地方莫过于 systemd 带来的改变,不同的管理服务的方式,不同的日志方式,设置时区,时间等等. ...
- Android开发网上的一些重要知识点[经验分享]
1. android单实例运行方法 我们都知道Android平台没有任务管理器,而内部App维护者一个Activity history stack来实现窗口显示和销毁,对于常规从快捷方式运行来看都是s ...
- OpenCV 学习笔记03 threshold函数
opencv-python 4.0.1 简介:该函数是对数组中的每一个元素(each array element)应用固定级别阈值(Applies a fixed-level threshold) ...
- 章节0:MySQl学前知识储备
一.数据库基础: 1.数据库(database):保存有组织的数据的容器(通常是一个文件或一组文件). 2.数据库管理系统(DBMS):创建和操纵数据库的软件系统. 3.表(table):某种特定类型 ...
- 如何在"Visual Studio Code"中使用" Git" 进行版本控制
如何在"Visual Studio Code"中使用" Git" 进行版本控制 本来认为此类教程,肯定是满网飞了.今天首次使用VS Code的Git功能,翻遍了 ...
- JavaScript面向对象:类、方法、属性
JavaScript是一种基于对象的语言,与传统面向对象语言(C#.C++)相比,JavaScript中没有类的概念,其继承有两种基本形式:基于对象的继承和基于类型的继承(原型链继承).无论哪种形式的 ...