Linux C/C++异常处理方法

news2025/7/6 11:22:24

简介

C/C++属于较为接近底层的语言,不像Java等“高级”语言,所有异常都能catch住(例如常见的core dumped)异常:

int first_func()
{
    int* error_integer = nullptr;
    return *error_integer;
}

对于异常,首要任务是进行定位,并做对应的修复。但存在一些程序,因种种原因测试不够充分,为了保证程序“不崩溃”,本文介绍几个常见的异常处理方法。

Trap SIGSEGV 使用 try/catch

针对SIGSEGV信号处理的异常,需要新增编译选项 

-fnon-call-exceptions

CMakeList:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fnon-call-exceptions")

定义SegmentationFaultException:

class SegFaultException : public std::exception {
public:
    const char* what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW override
    {
        return "segmentation fault";
    }

    ~SegFaultException() override = default;
};

void throw_segmentation_fault_exception(int)
{
    throw SegFaultException();
}

使用方式:

int main()
{
    signal(SIGSEGV, throw_segmentation_fault_exception);
    try {
        first_func();
    } catch (const std::exception& e) {
        std::cout << e.what() << std::endl;
    }
    return 0;
}

使用这种方式后可以捕获空指针异常,但整个程序会变得不够安全:有些原本不会抛出异常的场景也会抛出异常,这可能会导致一些问题,例如抛出异常后造成内存泄漏。

除了简单的Demo外,有专门的开源代码Trap底层异常:

https://code.google.com/archive/p/segvcatch/icon-default.png?t=M85Bhttps://code.google.com/archive/p/segvcatch/

“保护进程”

思路是由一个主进程保证安全,fork子进程处理工作。如果子进程异常,不影响主流程。这类方法主要是需要应用在多核CPU上。

使用进程方法时,可能会有备选方案:为了系统稳定性,会从多个方案中选择稳定的方案进行尝试。

“串行”尝试

int main()
{
    pid_t pid, w;
    int w_status;
    for (int attempts = 0; attempts < 2; ++attempts) {
        pid = fork();

        /**
         * exit if fork fail
         */

        // 子进程
        if (pid == 0) {
            attempts == 0 ? first_func() : second_func();
            exit(0);
        }
        w = waitpid(pid, &w_status, WUNTRACED | WCONTINUED);
    }
    printf("parent done. \n");
    return 0;
}

如果需要使用waitpid的返回值和获取对应子进程的状态,可以参考:

https://www.codingdict.com/questions/45424https://www.codingdict.com/questions/45424

“并行”尝试

同“串行”比较相似:

int main()
{
    pid_t pids[2];
    for (int attempts = 0; attempts < 2; ++attempts) {
        pid_t pid = fork();
        if (pid == 0) {
            attempts == 0 ? first_func() : second_func();
            exit(0);
        }
        pids[attempts] = pid;
    }

    for (auto& p: pids) {
        waitpid(p, nullptr, WUNTRACED | WCONTINUED);
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

传统 Web 框架部署与迁移

与其说 Serverless 架构是一个新的概念&#xff0c;不如说它是一种全新的思路&#xff0c;一种新的编程范式。 但是原生的 Serverless 开发框架却非常少。以 Web 框架为例&#xff0c;目前主流的 Web 框架“均不支持 Serverless 模式部署”&#xff0c;因此我们一方面要尝试接…

跳槽or裸辞?2022年真不建议···

2022年是个“难过”的一年。 疫情、经济寒冬、房价跳水、基金股票一片红。其实这些都是连锁反应。 企业不好过&#xff0c;也会引发一系列裁人潮&#xff0c;其实最近挺多小伙伴反映过&#xff0c;今年过的如牛马&#xff0c;一人干活量顶仨。想辞职躺平&#xff0c;又没有绝…

BurpSuit官方实验室之信息泄露

BurpSuit官方实验室之信息泄露 这是BurpSuit官方的实验室靶场&#xff0c;以下将记录个人信息泄露共5个Lab的通关过程 Web Security Academy: Free Online Training from PortSwigger lab1&#xff1a; Information disclosure in error messages 错误消息中的信息泄露 在…

从金鸡百花电影节,看“鼓浪屿元宇宙”的元力、魅力与想象力

文|智能相对论 作者|青月 元宇宙的走红&#xff0c;始于2021年3月10日Roblox在美上市&#xff0c;这个和现实世界相平行又相交叉的虚拟世界开始引起市场的注意&#xff0c;并迅速风靡全球。 虽然2022年&#xff0c;关于元宇宙的探索已经进入了一个相对务实的阶段&#xff0c…

【毕业设计】机器视觉停车位识别检测系统 - python 深度学习

文章目录1 简介2 检测效果3 实现方式3.1 整体思路3.2 检测空车位3.3 车辆识别4 最后1 简介 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&#xff0c;各个学校对毕设…

【面试题】「2023」JavaScript 最新高频 前端面试题 指南 (必看)

前言 大家好&#xff0c;本次总结了关于JavaScript的上百道高频面试考点&#xff0c;感谢大家的留言点赞收藏 &#x1f497; 如果文中有不对、疑惑或者错字的地方&#xff0c;欢迎在评论区留言指正&#x1f33b; 更多题库 地址&#xff1a;前端面试题库 基础篇 1. 将数组的…

【微前端开发环境下,加载远程子应用的实战。】

一开始我们的本地开发运行的环境&#xff0c;如果没有启动子应用的话。对应的页面是白屏的。 问题&#xff1a; 当有关联资源需要跳转时无法跳转&#xff0c;需要额外打开一个浏览器tab页到环境上面执行操作。当bug类型为纯ui-server端的内容时&#xff0c;需要手动启动bug相关…

【数据库原理及应用】——事务并发控制和恢复技术(学习笔记)

&#x1f4d6; 前言&#xff1a;事务是数据库操作的基本逻辑单元&#xff0c;事务处理技术主要包括数据库并发控制技术和恢复技术。本章首先介绍了事务的基本概念和四个特性&#xff0c;然后讨论事务并发操作可能引起数据库的不一致性&#xff0c;继而引入数据库的并发控制技术…

Compare线刷包与卡刷包

Android系统分为卡刷包和线刷包 小米11线刷包 从该版本的boot.img中抽取出的内容如下图 小米11卡刷包 从该版本的boot.img中可以提取的内容是 也就是说&#xff0c;想要做配置文件抽取需要用线刷包。经过测试&#xff0c;目前高版本的卡刷包通过解压都无法获取到boot.img…

图像分割 - 阈值处理 - 固定阈值法

目录 1. 介绍 2. 固定阈值处理 1. 介绍 图像分割就是将图像分成不同的区域&#xff0c;每个区域满足相似的条件。通常&#xff0c;都是将图像分为两个区域&#xff1a;前景区域和背景区域。 前景就是人们感兴趣的位置&#xff0c;例如一副Lena图像&#xff0c;我们只对这副图…

Redis-Mysql八股总结

Redis 说一下 Redis以及Redis 使用场景 答&#xff1a;Redis 是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 Redis 设置过期时间的命令 # 设置 key 在…

上网行为监控都能审计到哪些内容?

现在很多企业都部署了上网行为监控系统&#xff0c;那么&#xff0c;它可以审计到哪些内容呢&#xff1f;目前市面上有不同种类的上网行为监控系统&#xff0c;其功能都是大同小异的&#xff0c;这里我们以墨门云为例&#xff0c;了解一下装了这个软件之后管理者可以审计到哪些…

WPF探究【一】

文章目录WPF的概述&#xff1a;控件分类XAML对象元素语法XAML根元素WPF和XAML命名空间声明控件Lablel示例继承关系TextBlockbuttonBorderWPF的概述&#xff1a; WindowsPresentationFoundation&#xff08;简称WPF&#xff09;WPF的核心是一个与分辩率无关且基于实量的呈现引擎…

【深入理解Kotlin协程】使用Job控制协程的生命周期

Job 是协程上下文CoroutineContext的实现之一&#xff0c;通过它我们可以对协程的生命周期进行一些控制操作。Job 是协程的句柄。使用 launch 或 async 创建的每个协程都会返回一个 Job 实例对象&#xff0c;该实例是相应协程的唯一标识并管理其生命周期。还可以将 Job 传递给 …

数据结构与算法(四) 广度优先搜索

本篇文章继续来学习广度优先搜索算法&#xff08;Broad-First-Search&#xff0c;BFS&#xff09; 1、本质 广度优先搜索本质上还是遍历整个搜索空间&#xff0c;找到给定问题的解 实际上也是一种暴力搜索算法&#xff0c;不过其中的实现细节和优化细节还是值得探讨的 与深度…

基于PHP+MySQL的大学生交友社交网站

近年来,大学生的数量在逐步的增加,为了能够让这些大学生有一个更好的交友环境,需要创建一个基于大学生的社交交友网站。这样可以拉近彼此大学生之间的感情,让他们可以更好的进行学习和交流。 PHP大学生交友社交网站通过PHP&#xff1a;MySQL进行开发,分为前台和后台两部分,通过…

线程的状态

Java中线程的状态是通过枚举类型Thread.State表示的 &#xff0c;通过打印这些枚举类型&#xff0c;就可以知道java中线程的状态有哪些 public class ThreadState {public static void main(String[] args) {for (Thread.State state : Thread.State.values()) {System.out.pr…

进销存管理系统是什么?有哪些功能?

对于2022年刚开始&#xff0c;但是可以的确的是禽流感在短时期内是不可能返回他们&#xff0c;作为虚拟店面批发商想勇往直前中&#xff0c;就必须要亲吻网络&#xff0c;把销售业务从实体店搬至线上去。 想突破现状&#xff0c;化解虚拟店面批发民营企业的存活问题&#xff0…

ES初使用记录——写入与查询数据

本周接到一个任务&#xff1a;定时统计订单表中的数据&#xff0c;将异常订单挑出来&#xff0c;放入ES中供统计页面从总数点击跳转过去进行列表展示。 一、配置ES 配置maven&#xff0c;注入template Resource private ElasticsearchTemplate elasticsearchTemplate; 二、…

一、OBS概述

1. 概述 obs官网git源码编译 2. 软件能力 输入&#xff1a;文本、图片、窗口、音视频及摄像头等 处理&#xff1a;视频及图片滤镜、音频混音等 输出&#xff1a;rtmp推流、本地录制(mp4)、音视频裸数据(pcm/yuv/rgb)等 3. 模块 a. core核心模块 libobs 加载、管理各个功能…