C语言中signal函数简介及使用

2023-11-09

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");
}

} // namespace

int 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 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言中signal函数简介及使用 的相关文章

  • C++11中std::lock_guard的使用

    互斥类的最重要成员函数是lock 和unlock 在进入临界区时 执行lock 加锁操作 如果这时已经被其它线程锁住 则当前线程在此排队等待 退出临界区时 执行unlock 解锁操作 更好的办法是采用 资源分配时初始化 RAII 方法来加锁
  • C++中的虚函数表介绍

    在C 语言中 当我们使用基类的引用或指针调用一个虚成员函数时会执行动态绑定 因为我们直到运行时才能知道到底调用了哪个版本的虚函数 所以所有虚函数都必须有定义 通常情况下 如果我们不使用某个函数 则无须为该函数提供定义 但是我们必须为每一个虚
  • C++/C++11中头文件algorithm的使用

  • C和C++安全编码笔记:动态内存管理

    4 1 C内存管理 C标准内存管理函数 1 malloc size t size 分配size个字节 并返回一个指向分配的内存的指针 分配的内存未被初始化为一个已知值 2 aligned alloc size t alignment siz
  • C++中namespace detail或namespace internal的使用

    在很多开源代码中偶尔会使用名字为 detail 或 internal 的命名空间 如OpenCV的modules目录中 有些文件中使用了namespace detail 有些文件中使用了namespace internal 名为detail
  • 在Ubuntu 18.04上支持C++17的std::filesystem的方法

    在Ubuntu 18 04上通过命令sudo apt install gcc g 安装的gcc g 版本为7 5 此版本并不直接支持filesystem 如下图所示 Ubuntu 18 04上的g 7 5支持experimental的fil
  • C++11容器中新增加的emplace相关函数的使用

    C 11中 针对顺序容器 如vector deque list 新标准引入了三个新成员 emplace front emplace和emplace back 这些操作构造而不是拷贝元素 这些操作分别对应push front insert和p
  • C++11中头文件atomic的使用

    原子库为细粒度的原子操作提供组件 允许无锁并发编程 涉及同一对象的每个原子操作 相对于任何其他原子操作是不可分的 原子对象不具有数据竞争 data race 原子类型对象的主要特点就是从不同线程访问不会导致数据竞争 因此从不同线程访问某个原
  • log库spdlog简介及使用

    spdlog是一个开源的 快速的 仅有头文件的C 11 日志库 code地址在 https github com gabime spdlog 目前最新的发布版本为0 14 0 它提供了向流 标准输出 文件 系统日志 调试器等目标输出日志的能
  • 提高C++性能的编程技术笔记:多线程内存池+测试代码

    为了使多个线程并发地分配和释放内存 必须在分配器方法中添加互斥锁 全局内存管理器 通过new 和delete 实现 是通用的 因此它的开销也非常大 因为单线程内存管理器要比多线程内存管理器快的多 所以如果要分配的大多数内存块限于单线程中使用
  • C和C++安全编码笔记:并发

    并发是一种系统属性 它是指系统中几个计算同时执行 并可能彼此交互 一个并发程序通常使用顺序线程和 或 进程的一些组合来执行计算 其中每个线程和进程执行可以在逻辑上并行执行的计算 这些进程和 或 线程可以在单处理器系统上使用分时抢占式的方式
  • Effective C++改善程序与设计的55个具体做法笔记

    Scott Meyers大师Effective三部曲 Effective C More Effective C Effective STL 这三本书出版已很多年 后来又出版了Effective Modern C More Effective
  • C语言中signal函数简介及使用

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

    std bind函数是用来绑定函数调用的某些参数的 std bind它可以预先把指定可调用实体的某些参数绑定到已有的变量 产生一个新的可调用实体 它绑定的参数的个数不受限制 绑定的具体哪些参数也不受限制 由用户指定 std bind 1 将
  • C++14中返回类型推导的使用

    使用C 14中的auto返回类型 编译器将尝试自动推导 deduce 返回类型 namespace int xx 1 auto f return xx return type is int const auto f3 return xx r
  • C++中的封装、继承、多态

    封装 encapsulation 就是将抽象得到的数据和行为 或功能 相结合 形成一个有机的整体 也就是将数据与操作数据的源代码进行有机的结合 形成 类 其中数据和函数都是类的成员 封装的目的是增强安全性和简化编程 使用者不必了解具体的实现
  • C++中typeid的使用

    RTTI Run TimeType Information 运行时类型信息 它提供了运行时确定对象类型的方法 在C 中 为了支持RTTI提供了两个操作符 dynamic cast和typeid The typeid operator pro
  • 概率论中伯努利分布(bernoulli distribution)介绍及C++11中std::bernoulli_distribution的使用

    Bernoulli分布 Bernoulli distribution 是单个二值随机变量的分布 它由单个参数 0 1 给出了随机变量等于1的概率 它具有如下的一些性质 P x 1 P x 0 1 P x x x 1 1 x Ex x Var
  • C++17中utf-8 character literal的使用

    一个形如42的值被称作字面值常量 literal 这样的值一望而知 每个字面值常量都对应一种数据类型 字面值常量的形式和值决定了它的数据类型 由单引号括起来的一个字符称为char型字面值 双引号括起来的零个或多个字符则构成字符串型字面值 字
  • C++/C++11中变长参数的使用

    C C 11中的变长参数可以应用在宏 函数 模板中 1 宏 在C99标准中 程序员可以使用变长参数的宏定义 变长参数的宏定义是指在宏定义中参数列表的最后一个参数为省略号 而预定义宏 VA ARGS 则可以在宏定义的实现部分替换省略号所代表的

随机推荐

  • 无法连接设备_设备显示“已连接但无法访问互联网”如何解决?当贝市场一招搞定...

    家里的wifi时不时就会出现问题 其中比较常见的就是已连接 但是仍然无法访问互联网 这是怎么回事 对此当贝小编决定为大家提出几个解决方法 第一种原因或许是来自路由器内存的问题 路由器本身有一个日志功能 里面存了很多工作记录 有的路由器本身内
  • 计算机上没有找到服务was,win7 64位在计算机没找到was服务如何解决

    win7系统凭借良好的兼容性和稳定性现在还受到很多用户欢迎 但使用久了之后难免会出现一些问题 例如有的网友就反映说自己的win7旗舰版电脑出现了 右键运行网站的时候 提示在计算机 上没有找到WAS服务的情况 该怎么解决呢 下面本文就来为大家
  • log4cpp 日志库的使用

    简述 平时调试c c程序和记录一些程序打印信息时 使用的最多的就是printf 但是终端显示有限 而且不利于统计 所以想把开源的日志库加入到工程中 测试对比了一些日志库 发现log4cpp比较适合我们的工程 1 可以自由控制日志在终端和日志
  • 调用高德逆地理接口_地理编码与逆地理编码

    本章主要介绍如何将地址描述信息和地理坐标做相互转化 主要包括以内容 正向地理编码 逆向地理编码 地理编码服务 地理编码包含正向地理编码和逆向地理编码两种 正向地理编码 将地址描述信息转换成地理坐标 经纬度 对应为AMap Geocoder的
  • 242. Valid Anagram

    class Solution public bool isAnagram string s string t 使用sort排序 sort s begin s end sort t begin t end if s t return true
  • restful api 与 GraphQL 分析比较

    背景 REST作为一种现代网络应用非常流行的软件架构风格 自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史 它的简单易用性 可扩展性 伸缩性受到广大Web开发者的喜爱 REST 的 API 配合JS
  • 说一说PCIe5.0的速率和带宽

    最近 有一个并不肤浅的同事问了我一个问题 U 2的带宽是多少 为什么有人说U 2最大是32GB s 首先 从PCIe5 0 CEM规范里我们查到 对于一条lane来说 PCIe5 0 的Basic bandwidth为32 0 GT s 这
  • Thread协议介绍

    Thread 由三星 Nest ARM Big Ass Fans 飞思卡尔和Silicon Labs公司联合推出 是一种基于IP的无线网络协议 用来连接家里的智能产品 比较常用的网络协议有 WiFi 蓝牙 ZigBee Z Wave 不过都
  • 钱包应用

    使用LightWallet和Hooked Web3 Provider创建钱包服务 1 运行geth实例挖矿并启动HTTP RPC服务器 允许来自任何域名客户端请求 解锁账户0 geth dev rpc rpccorsdomain rpcad
  • fvf采用另外一种方式渲染

    if FAILED hr getActiveD3D9Device gt SetVertexDeclaration d3ddecl gt getD3DVertexDeclaration getGlobalInstanceVertexBuffe
  • qt输出到控制台

    include
  • Node.js开发——解决Cesium视角切换的异常

    最近在利用Cesium做开发时 版本是v25 发现一个bug 在它的SandCastle中的任何一个例子 如果用的是Chrome浏览器 在2D视图和2 5D视图之间多次切换 会报一个错 换成firefox浏览器就没问题 An error o
  • 区块链之Solidity类型

    Solidity语言 IDE https remix ethereum org 合约文件结构 版本申明 import 合约 状态变量 函数 结构类型 事件 函数修改器 代码注释 结构举例 表示从0 4 0版本到0 5 0版本 pragma
  • Qt 编程点滴4

    编译win32 中的 dll工程配置方法 以skypebackend为例 因为工程中的代码全是标准C 的代码 所以编译方式跟Qt有点不一样 Project properties Project settings页中的 This is a c
  • 解决java.net.SocketException: Invalid argument or cannot assign requested address

    今天发现facebook app读取facebook上的api时发生以下错误 java net SocketException Invalid argument or cannot assign requested address 解法 l
  • helm下

    讲师 李振良 官方网站 http www ctnrs com 第三章 Helm应用包管理器 下 说明 强烈建议学习课堂视频 更多细节都在里面 本文档为内部学员资料 请不要随意转发 3 6 Chart模板 Helm最核心的就是模板 即模板化的
  • xci转nsp工具_再谈xci、nsz、nsp

    每次群里有人问到进相册的homebrew为什么装不了补丁 或者说刚拉进去的文件为什么读取不到 老白之前推荐的aw 适用大气层 后期有改版aw适用TX tinleaf 适用于TX aw和tinleaf可以直接安装xci nsp nsz 安装n
  • 【爬虫】selenium+webdrive抓取淘宝商品评价

    爬虫 selenium webdrive抓取淘宝商品评价 爬虫小白入门 声明 本人只是处于突如其来的兴趣学习一点点 水平实在不高 但在这个过程中也或多或少地解决了一些问题 所以对同为小白的朋友们或许有用 但还请大神们不要笑我 动手前必备的知
  • DispatcherServlet工作原理简介说明

    转自 DispatcherServlet工作原理简介说明 下文笔者将讲述DispatcherServlet的工作流程 如下所示 当DispatcherServlet接到请求时 他先回查找适当的处理程序来处理请求 DispatcherServ
  • C语言中signal函数简介及使用

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