C语言signal()函数(通过设置一个函数(回调函数)来处理捕获到异常信号时需要执行的操作)
文章目录
- 描述
- 声明
- 参数
- 返回值
- 实例
- 附加解释
- 背景知识:C语言中signal函数简介及使用
描述
C 库函数 void (*signal(int sig, void (*func)(int)))(int)
设置一个函数来处理信号,即带有 sig 参数的信号处理程序。
声明
下面是 signal() 函数的声明。
void (*signal(int sig, void (*func)(int)))(int)
参数
- sig – 在信号处理程序中作为变量使用的信号码。下面是一些重要的标准信号常量:
- func – 一个指向函数的指针。它可以是一个由程序定义的函数,也可以是下面预定义函数之一:
返回值
该函数返回信号处理程序之前的值,当发生错误时返回 SIG_ERR。
实例
下面的实例演示了 signal() 函数的用法。(在linux下运行,windows没有unistd.h头文件)
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>void sighandler(int);int main()
{signal(SIGINT, sighandler);while(1) {printf("开始休眠一秒钟...\n");sleep(1);}return(0);
}void sighandler(int signum)
{printf("捕获信号 %d,跳出...\n", signum);exit(1);
}
让我们编译并运行上面的程序,这将产生以下结果,且程序会进入无限循环,需使用 CTRL + C 键跳出程序。开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
捕获信号 2,跳出...
我在linux下编译运行,还真是这样子:
[root@ubuntu /home/yg/arnold_test/20211201_TEST_signal]3# gcc TEST_SIGNAL.c
[root@ubuntu /home/yg/arnold_test/20211201_TEST_signal]4#
[root@ubuntu /home/yg/arnold_test/20211201_TEST_signal]4#
[root@ubuntu /home/yg/arnold_test/20211201_TEST_signal]4# ./a.out
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
^C捕获信号 2,跳出...
附加解释
void (*signal(int sig, void (*func)(int)))(int)
解释一下该函数的申明怎么读,后面附带的两个(int)的意思是:该符号前的函数指针所对应的函数是带一个int类型的参数的。比如最外面的,是说signal返回的函数指针所对应的函数是带int的参数的;里面的,作为参数的函数名是带一个int参数的。
- 中间部分:
signal( int sig, void (*func)(int))
signal函数有2个参数,第一个是int,第二个是无返回值,带一个int参数的函数指针
- 外围:
void (*signal(xxx)) (int)
signal函数返回的是一个函数指针,无返回值,有一个int参数
- 简化:
typedef void Sigfunc(int)
Sigfunc就代表的就是一个 返回值是一个无返回值,有一个int参数的函数。
最后就成了这样:
Sigfunc *signal(int, Sigfunc*)
参考文章:C 库函数 - signal()
背景知识:C语言中signal函数简介及使用
signal.h是C标准函数库中的信号处理部分,定义了程序执行时如何处理不同的信号。信号用作进程间通信,报告异常行为(如除零)、用户的一些按键组合(如同时按下Ctrl与C键,产生信号SIGINT)。C++中的对应头文件是csignal。
C语言标准定义了6个信号,都定义在signal.h头文件中:
(1). SIGABRT:程序异常中止,如调用abort函数。(abort)
(2). SIGFPE:算术运算出错,如除数为0或溢出。
(3). SIGILL:非法函数映像,如非法指令。
(4). SIGINT:交互的用户按键请求,如同时按下Ctrl+C键。
(5). SIGSEGV:无效内存访问,段错误。
(6). SIGTERM:程序的中止请求。
signal.h可能还定义了其它信号,这依赖于具体实现。例如,类Unix系统还定义了15个以上的信号。Visual C++的C标准库只支持C语言标准规定的6个信号,即对信号处理只提供最小的支持。
signal函数:该函数设置一个函数(回调函数)来处理捕获到异常信号时需要执行的操作
参考文章:C语言中signal函数简介及使用
C语言signal()函数(通过设置一个函数(回调函数)来处理捕获到异常信号时需要执行的操作)相关推荐
- zmq 接口函数之 :zmq_socket_monitor - 注册一个监控回调函数
ZeroMQ 官方地址 :http://api.zeromq.org/4-2:zmq-socket-monitor zmq_socket_monitor(3) ØMQ Manual - ØMQ/4.1 ...
- 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试
案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...
- php回调函数的作用域,PHP将回调函数作用到给定数组单元的方法
PHP将回调函数作用到给定数组单元的方法 数组是PHP程序设计中十分重要的一环.本文介绍PHP中数组函数array_map()的用法,实现将回调函数作用到给定数组单元上.具体如下: array arr ...
- 回调函数 —— 借助中间通用函数(形参里有函数指针,实现函数注册)调用不同的回调函数 (多态/分层)
回调函数传参:函数指针做函数参数(回调函数) 目录 背景 回调函数是实现函数分层且单向依赖的好办法,使用函数指针运行 struct结构体回调函数代码更清晰 简单理解回调函数 Demo 其他回调函数博文 ...
- 函数指针的使用精髓 -- 回调函数+qsort的内部实现
前言: 我们有普通指针(存放普通变量的地址).数组指针(存放数组的地址)... ... 那函数的地址可以存起来吗?可以的话该怎么用函数指针呢?这是本篇博客探讨的问题... 目录: 一.函 ...
- C语言之回调函数(非常重要)附带回调函数版本实现整型的加减乘除四则运算
对于回调函数!想必大家的第一想法,想必就是函数吧!其实这个也是笔者的第一想法,毕竟之前没有见过回调函数,所以就不怎么知道细节!默认为直接调用函数,就是回调函数,但等学会了回调函数,其实就不是这样想了! ...
- java回调函数的生命_Java的回调函数 - choaklin 的个人空间 - OSCHINA - 中文开源技术交流社区...
暂且不提回调函数的各种定义,如我本人,虽然知道JavaScript的回调的使用,但是百科了回调的定义,还是觉得云里来雾里去.所以大可先从已熟悉的入手,旁推侧引它的原理,再引出Java版的实现. 因为博 ...
- 什么是回调函数?为什么要使用回调函数?如何使用回调函数?
1. 什么是回调函数: 函数指针的调用,即是一个通过函数指针调用的函数: 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数. In compu ...
- html里的回调函数的作用域,异步与回调/函数的作用域链
异步与回调/函数的作用域链 JavaScript 只在一个线程上运行,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待. 这种模式的好处是实现起来比较简单,执行环境相对单纯:坏 ...
最新文章
- java编译器 Javac 编译原理
- Shell编程基入门
- asp 之 让实体中字段类型为DateTime的字段仅仅显示日期不显示时间
- swift怎么调用Java,Swift完成UIAlertController的调用
- scp命令默认传输速度多大_每天一个linux命令(60):scp命令
- sqlserver java odbc_Java JDBC------------------ODBC(SQLServer)链接
- 10个精妙的Java编码最佳实践
- django orm 之makemigrations和migrate命令
- 测试开发必备技能-Jmeter二次开发
- 机器人环境感知算法之算法分析阶段
- [示例代码]植物大战僵尸网页版
- 【深度学习】数据读取与数据扩增方法
- Zend Studio 13.6.1下载和安装汉化破解版
- (转)EditText属性详解
- 以太坊之Remix部署智能合约(Remix简介,使用,测试网络部署合约)
- Google - Guice 入门介绍
- 沈阳地铁行业运行状况与发展模式调研报告2022版
- pycharm代码自动添加时间及日期
- ubantu 添加防火墙策略_linux - 如何在Ubuntu上设置简单的防火墙? - Ubuntu问答
- 易语言视频教程(黑旋易语言教程)一套