signal.h是C标准函数库中的信号处理部分,定义了程序执行时如何处理不同的信号。信号用作进程间通信,报告异常行为(如除零)、用户的一些按键组合(如同时按下Ctrl与C键,产生信号SIGINT)。C++中的对应头文件是csignal。

C语言标准定义了6个信号,都定义在signal.h头文件中:

(1). SIGABRT:程序异常中止,如调用abort函数。

(2). SIGFPE:算术运算出错,如除数为0或溢出。

(3). SIGILL:非法函数映像,如非法指令。

(4). SIGINT:交互的用户按键请求,如同时按下Ctrl+C键。

(5). SIGSEGV:无效内存访问,段错误。

(6). SIGTERM:程序的中止请求。

signal.h可能还定义了其它信号,这依赖于具体实现。例如,类Unix系统还定义了15个以上的信号。Visual C++的C标准库只支持C语言标准规定的6个信号,即对信号处理只提供最小的支持。

signal函数:该函数设置一个函数(回调函数)来处理捕获到异常信号时需要执行的操作,其函数声明方式如下:

// Type of a signal handler
typedef void (*__sighandler_t)(int);
__sighandler_t signal(int __sig, __sighandler_t __handler);

下面是测试代码:

#include "signal.hpp"
#include <signal.h>
#include <string>
#include <thread>
#include <chrono>namespace signal_ {namespace {bool flag = true;void process_exit(int sig)
{switch (sig) {case SIGINT:fprintf(stderr, "process exit: SIGINT: value: %d\n", sig);break;case SIGFPE:fprintf(stderr, "process exit: SIGFPE: value: %d\n", sig);break;case SIGABRT:fprintf(stderr, "process exit: SIGABRT: value: %d\n", sig);break;case SIGILL:fprintf(stderr, "process exit: SIGILL: value: %d\n", sig);break;case SIGSEGV:fprintf(stderr, "process exit: SIGSEGV: value: %d\n", sig);break;case SIGTERM:fprintf(stderr, "process exit: SIGTERM: value: %d\n", sig);break;default:fprintf(stderr, "process exit: value: %d\n", sig);break;}flag = false;
}void wait_ctrl_c()
{while (flag) {std::this_thread::sleep_for(std::chrono::seconds(2));fprintf(stdout, "please press to exit: Ctrl + c ... \n");}
}void signal_type()
{signal(SIGINT, process_exit);signal(SIGFPE, process_exit);signal(SIGILL, process_exit);signal(SIGABRT, process_exit);signal(SIGSEGV, process_exit);signal(SIGTERM, process_exit);
}void signal_sigill(int)
{fprintf(stdout, "caught SIGILL signal\n");
}void signal_sigterm(int)
{fprintf(stdout, "caught SIGTERM signal\n");
}} // namespaceint test_signal_SIGINT()
{signal_type();std::thread th(wait_ctrl_c);th.join();return 0;
}int test_signal_SIGILL()
{//signal_type();if (signal(SIGILL, signal_sigill) == SIG_ERR) {fprintf(stdout, "cannot handle SIGILL\n");} else {fprintf(stdout, "yyyyy\n");}return 0;
}int test_signal_SIGFPE()
{signal_type();int a = 1, b = 0, c;c = a / b;fprintf(stdout, "c = %d\n", c);return 0;
}int test_signal_SIGSEGV()
{signal_type();int a[3] = {0};fprintf(stdout, "a[3] = %d\n", a[-1111111]);return 0;
}int test_signal_SIGTERM()
{//signal_type();if (signal(SIGTERM, signal_sigterm) == SIG_ERR) {fprintf(stdout, "cannot handle SIGTERM\n");} else {fprintf(stdout, "xxxxx\n");}return 0;
}int test_signal_SIGABRT()
{signal_type();abort();return 0;
}} // namespace signal_

测试test_signal_SIGINT时的输出结果如下:

GitHub: https://github.com/fengbingchun/Messy_Test

C语言中signal函数简介及使用相关推荐

  1. c语言中signal函数详细解释说明

    c语言中signal函数详细解释说明     对于 信号处理函数 位于 <signal.h> 中. void ( *signal( int sig, void (* handler)( i ...

  2. c语言中signal函数详细说明--举例

    在signal.h头文件中还有以下几个定义 #define SIG_ERR (void ()())-1 #define SIG_DFL (void ()())0 #define SIG_IGN (vo ...

  3. C语言中select函数简介及使用

    select函数用来检查套接字描述符(sockets descriptors)是否已准备好读/写,提供了一种同时检查多个套接字的方法. Linux中select函数的声明在/usr/include/x ...

  4. (转)C语言中Exit函数的使用

    C语言中Exit函数的使用 exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了, ...

  5. exit在c语言里的作用,C语言中exit函数的使用

    exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调 ...

  6. c语言中阻止程序退出的函数,(转)C语言中Exit函数的使用

    C语言中Exit函数的使用 exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了, ...

  7. 关于C语言中printf函数“输出歧视”的问题

    目录 关于C语言中printf函数"输出歧视"的问题 问题描述 探索问题原因 另一种研究方法 问题结论 关于C语言中printf函数"输出歧视"的问题 问题描述 ...

  8. C语言中atoi()函数的用法

    C语言中atoi()函数的用法 一.学习要点: 1.int atoi(const char *str)把参数str所指向的字符串转换为一个整数: 二.代码 #include<stdio.h> ...

  9. r语言中c函数错误,R语言中c()函数与paste()函数的区别说明

    c()函数:将括号中的元素连接起来,并不创建向量 paste()函数:连接括号中的元素 例如 c(1, 2:4),结果为1 2 3 4 paste(1, 2:4),结果为"1 2" ...

最新文章

  1. python 数据分析学什么-入门数据分析,我应该学习什么编程语言
  2. php 调用 perl,在PHP中使用与Perl兼容的正则表达式
  3. Boost::context模块callcc的无限循环测试程序
  4. 独家下载!2021前端热门技术解读
  5. 三维重建 几何方法 深度学习_Occupancy Networks:基于学习函数空间的三维重建表示方法...
  6. thinkphp mysql函数_thinkphp对数据库操作有哪些内置函数
  7. Python字符串的格式化,看这一篇就够了
  8. java 根据类名示例化类_Java收集器类– 18个示例
  9. 【Django 2021年最新版教程12】GET POST请求参数 如何接收、判空、默认值
  10. 又拍云引领云CDN加速 或成互联网刚性需求
  11. atitit. 日志系统的原则and设计and最佳实践(1)-----原理理论总结.
  12. python 写excel 保留空格_通过自动填充列中的空格来操作excel表的Python脚本
  13. 推荐系统-猜你喜欢设计
  14. 局域网共享工具_Win10局域网共享开启工具
  15. 错误解决:java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to star
  16. 人工客服——图灵机器人教程
  17. 论文发表如何选择期刊
  18. 2005年国内最有份量的资源下载网站一览
  19. 警告:integer division in floating-point context
  20. ps怎么添加叠加素材

热门文章

  1. ppt html结构,HTML文档的基本结构.ppt
  2. 海店湾:酒店成七夕新宠,浪漫之旅周边游说走就走!
  3. python爬虫登录正方教务管理系统获取成绩数据
  4. 怎么查找计算机SCI文献? - 易智编译EaseEditing
  5. 第三天 本来是吃吃玩玩愉快的一天, Airpods耳机充电仓丢了 ,淦 ➡_➡!但学习还得继续!!
  6. 惆怅长岑长惆怅长岑长惆怅长岑长吃吃吃
  7. 推荐10款最新的免费设计素材
  8. js——获取两个日期之间相差多少天或者多少时间(天+小时+分+秒)——基础积累
  9. Linux网络性能评估工具iperf 、CHARIOT测试网络吞吐量
  10. Idea运行APP步骤整理