signal函数与setjmp&longjmp

signal() -函数的详细使用说明 函数用于设置特定信号的处理方式。它允许程序在接收到特定信号时执行自定义的处理函数,或者采用默认的处理方式,也可以选择忽略该信号。这些信号在不同的操作系统上可能会有一些细微的差别,但总体上它们的行为是相似的。在编写程序时,可以根据需要使用。函数或其他信号处理机制来改变这些信号的默认行为,以实现更灵活的程序控制和错误处理。这个函数接收两个参数,返回一个函数指针。以下是一个完整的示例代码,展示了如何使用。 阅读详情

先放定义

1. signal函数

#include<singal.h>
void (*signal(int signo, void(*func)(int))(int);

       函数原型主体部分是signal(int signo, void (*func)(int)),其中signo就是要设置的信号名参数,而func函数是针对signo信号的处理方式。func可以是常量SIG_IGN、SIG_DFL或者一个函数地址,分别代表:忽视该信号、使用系统默认方式处理该信号、使用指定函数处理该信号。看到此处如果还不理解可以继续往下看或者参考APUE10.3节内容。

2.setjmp和longjmp

#include<setjmp.h>
int setjmp(jmp_buf env);

void longjmp(jmp_buf env, int val);

       先说参数,env是一种jump_buf类型的变量,它是某种形式的数组,存放在调用longjmp时能够用来回复栈状态的所有信息,一般是全局变量。val是一个整型变量。

       再说用法。setjmp设置一个标记位置,程序通过longjmp可以跨越函数调到这个标记位置处执行。其中setjmp的返回 值就是longjmp的val变量。通过不同val值的longjmp跳跃,setjmp可以返回不同值,从而进行不同的处理。

       同样,可以参考apue7.10节内容。

用法

下面结合apue的图10-8程序来说一下我的理解。

1. 图10-8

#include<setnmp.h>
#include<signal.h>
#include<unistd.h>

static jmp_buf env_alrm;

static void sig_alrm(int signo)
{
    long jmp(env_alrm, 1);
}

unsigned int sleep2(unsigned int seconds)
{
    if(signal(SIGALRM, sig_alrm) == SIG_ERR)
        return(seconds);
    if(setjmp(env_alrm) == 0)
    {
        alarm(seconds);
        pause();
    }
    return(alarm(0));
}

2. 程序流程

          当sleep2被调用时发生以下情况。

          1)首先执行 第一个if内的signal运行,它将SIGALRM(闹钟信号)设置成:当SIGALRM发生时,捕获该信号,并用sig_alrm信号处理程序处理该信号。signal设置失败,则返回SIG_ERR,从而让if语句返回return(seconds)函数。如果设置成功,那么程序执行下一个if。注意:signal设置成功之后,sig_alrm在SIGALRM信号发生时自动调用,signal函数的作用只是设置好要调用的信号处理程序。

           2)第二个if内的setjmp函数执行,注意,此时是程序顺序执行到此处,setjmp函数返回值为0。如果是从longjmp返回到此处,那么setjmp返回值为longjmp的参数val。

           3)执行alrm(seconds)函数,它设置一个seconds的倒计时。如果超时则内核将发生一个SIGALRM信号。

           4)这一步将是不确定的,有两种情况。第一种是顺序执行pause()。它阻塞程序的运行,知道有一个信号发生,在这里就是SIGALRM的发生。有信号发生后,程序顺序执行return(alrm(0))。第二中情况是在程序调用pause()前,SIGALRM已经 发生。这是有可能的一种情况,特别是当系统比较繁忙的时候。CPU可能在执行完alarm之后,就去处理其他程序了,然后又在alarm超时之后回来本程序。此时,pause还没有运行,但SIGALRM已经 发生,那么程序就会调用信号处理程序sig_alrm,它又调用longjmp返回到第二个if的setjmp,setjmp返回val值(此处为1)。第二个if的判断式不成立,程序执行return(alarm(0))。

注:alarm、pause等函数如有不懂请自行百度。

sigsetjmp, siglongjmp #include <stdio.h> #include <signal.h> #include <setjmp.h> #include <unistd.h> #include <sys/time.h> sigjmp_buf jmp_env; static void connect_alarm(int a) { siglong... 阅读详情

相关推荐

在Ubuntu上通过Wine完美运行企业微信的详细指南

本文提供了在Ubuntu系统上通过Wine兼容层安装和运行企业微信的详细教程。针对官方未提供Linux版本的痛点,指南推荐使用Ubuntu Kylin团队优化打包的Wine环境,通过简单的命令行步骤即可完成部署,并涵盖启动、中文输入法配置、文件管理等常见问题的解决方案,帮助用户实现高效、稳定的办公沟通。

weixin_29306317的博客 229

Linux系统调用--signal、setjmp、longjmp、alarm和sleep

这涉及到信号捕获函数的有效性。信号捕获函数一旦被执行,如果不再重新设置信号捕获函数,那下次信号再发生了,触发的是默认的信号捕获函数------也就是会忽略这个信号,什么也不处理。因为在开始的时候设置SIGALRM的信号捕获函数。之后的地方继续执行。之后的地方继续执行?,在这个捕获函数里,使用。后程序为什么不继续回到。超时,但是不处理,再过。

qq_36346625的博客 370

在信号处理函数中调用longjmp

错误情况及原因分析   前两天看APUE的时候,有个程序要自己制作一个sleep程序,结果在这个程序中就出现了在信号处理函数中调用longjmp函数的情况,结果就出现了错误,具体错误是啥呢,请参见下面这段程序: 1 /* 2 * 在信号处理函数中调用longjmp的错误情况 3 */ 4 #include <errno.h> ...

weixin_30666943的博客 202

AI训练师团队管理运营思路

工具运营AI训练师主要是支撑运营,协助算法和运营提高托管机器人的解决能力,以协助降低业务场景熔断与优化场景识别为核心运营目标,通过算法聚类、标注分析等方式,结合业务知识,提供精准、清晰的标注数据和解决方案,确保训练效果满足需求。过程中需要与算法、运营一块参与模型搭建和数据验收,并且负责核心指标和数据日常的跟踪维护。④针对知识库已有意图进行梳理和分析,反馈运营评估缺失或合并意图优化方向。③对语料数据进行挖掘、清洗,解除缠绕、冗余等问题导致的未识别。①线上case分析,及时发现识别问题导致的托管熔断问题。

qq_25438419的博客 1084

一文带你弄懂thermal governor IPA

当current temp < target temp时,使用k_pu,当current temp >= target temp时,使用k_po。如果current_temperature = switch_on_temp时,则k_p = k_pu,这时Pmax。如果current_temperature = target_temp时,则k_p = k_po,这时Pmax。2、解析dts,获得switch_on_temp和target_temp。3、初始化k_pu/k_po/k_i/k_d的常数。

yxw0609131056的博客 1245

signal函数使用

函数名: signal 表头文件 #include&lt;signal.h&gt;   功 能: 设置某一信号的对应动作    函数原型 :void (*signal(int signum,void(* handler)(int)))(int);    或者:typedef void(*sig_t) ( int );   sig_t signal(int signum,sig_t ha...

kouriba 359

ElectrolyteGPT:首个电池电解液逆向设计的生成式 AI 系统 —— 算法原理与复现解析

数据驱动的重要性:1100 万→100 万的精心筛选,比单纯增大模型更有效领域适配:fLine 表示法、正则分词、化学感知的数据增强(SMILES randomization)都是关键小模型的力量:6M 参数在特定化学空间的表现,远超通用大模型在相同任务上的零样本能力条件生成的极限:10 维条件导致模型崩溃,提示我们需要更好的条件编码策略(如 diffusion guidance、RLHF-style 偏好优化)未来方向配方实验验证。

ASKCOS博客 122

sigsetjmp、siglongjmp

sigsetjmp函数用于保存程序当前的执行环境,以便稍后使用siglongjmp来恢复。sigsetjmp和siglongjmp是C语言中用于实现非局部跳转的两个函数,它们在头文件中定义。这两个函数用于处理信号(Signal),在某些情况下,可以用于实现异常处理和协程。env:被设置的环境数据对象,siglongjmp会根据该对象跳转。savesigs: 用来设置env是否需要保存信号相关环境信息。为0时不需要相关信息。返回值:如果是由sigsetjmp调用返回,返回值为0。

m0_61243666的博客 890

C++(Qt)软件调试---gdb调试入门用法(12)

学习GDB可以帮助程序员更好地调试程序,找到程序中的错误和问题,提高程序的质量和稳定性。 在开发大型软件时,程序中可能存在许多错误和问题,这些问题可能会导致程序崩溃或者出现不可预期的行为。 使用GDB可以帮助程序员更快地找到这些问题,并且提供一些调试工具来帮助程序员更好地理解程序的行为。

mahuifa的博客 5545

边缘计算与产业生态系统

目录 文章目录目录边缘计算产业参与者边缘计算产业生态系统 边缘计算产业参与者 边缘计算领域参与者众多,主流公司以打造生态优势为目标,基于自身服务层级向产业链上下两端进行拓展,目前市场主要参与者有: 系统集成商:在产业头部,具有广泛的能力,可以集成不同生态系统公司的产品,具有一定的全球性属性,在边缘计算领域大多由云服务商、电信运营商担任。 云服务商:具有领先的云技术优势与应用生态体系,同时拥有全球性资源布局与市场资源生态,并渴望成为边缘计算主导者。 电信运营商:具有边缘基础设施优势,以及不可替代的

烟云的计算 2100

C标准库源码解剖(9):控制函数assert.h, setjmp.h和signal.h

    控制函数用于对C语言程序的标准控制流(如if/else、switch、for等)提供扩展,在头文件assert.h、setjmp.h和signal.h中提供,分别提供表达式断言功能、非本地跳转功能、信号处理功能。    1、assert.h:提供用于断言的assert宏。程序中若没有定义NDEBUG,则asset(exp)对表达式exp进行断言,若断言为假(即为0),则会调用__a

Jack Zhou的专栏 3854

涨点神器:基于YOLOv8的SPD-Conv小目标检测实战教程——让低分辨率场景检测精度飙升

从代码修改到场景落地,每一步都围绕“提升检测精度”这个核心目标,而实际数据也证明了这项技术的强悍——它不是实验室里的花拳绣腿,而是能真正解决工业痛点的涨点神器。在实际场景中,比如无人机巡检的低分辨率航拍图中,对电线、小设备的检测,YOLOv8-SPD的漏检率降低了70%以上。落地时,只需将训练好的YOLOv8-SPD模型部署到边缘设备或云端,即可享受其在小目标、低分辨率场景下的强大性能。的特征融合模块中,通过插入SPD-Conv,让模型在处理小目标时,既能保留空间细节,又能增强通道维度的特征表达。

m0_71589036的博客 157

linux 信号 命令,Linux信号列表详解

我们运行如下命令,可看到Linux支持的信号列表:~$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM 17...

weixin_33514277的博客 622

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Unix信号详解(Signal的信号说明)

signal信号机制是属于计算机异常处理机制中的一种。 signal信号属于一种异步处理异常的机制之一。 类似于我们平常在命令行上对于死循环的程序,按下ctrl-z暂时挂起,ctrl-c程序终止,这些挂起,终止信号都属于signal信号的一种,常见的几种signal信号如下图所示(供查询使用,平时并无用): 信号常见的术语: 1.发送信号: 先简单介绍一下进程组的概念,一个操作系统有很多进

写代码的柯长的博客 7963

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)



signal() 函数详解 signal()函数详解: 在 这个头文件中。 signal(参数1,参数2); 参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。 参数2:我们处理的方式(是系统默认还是忽略还是捕获)。 一般有3中方式进行操作。 (1)eg: signal(SIGINT ,SI

lvchen19880427的专栏 962

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

signal函数详解

UNIX系统信号机制最简单的接口是signal函数

m0_61907339的博客 1820

C语言:setjmp和longjmp函数使用详解

转载自: https://www.runoob.com/cprogramming/c-standard-library-setjmp-h.html      https://blog.youkuaiyun.com/chenyiming_1990/article/details/8683413 1、C 标准库 - &lt;setjmp.h&gt; 简介 setjmp.h 头文件定义了宏 setjmp()、函数 ...

houxiaoni01的博客 5402

signal()函数

函数指针的返回类型为void,参数为int类型。也就是说,当信号被捕捉时,该函数会被调用,并传入信号编号作为参数。signal()函数是一个用于信号处理的POSIX标准C函数,原型定义在头文件中,用于。当程序接收到SIGINT信号(比如用户按下 Ctrl-C)时,第二个参数是一个函数指针,指向一个函数,这个函数在信号被捕捉时调用。第一个参数是一个整数,用于指定信号编号;在这个例子中,我们注册了一个名为。函数会被调用,并输出一条消息。

weixin_52018852的博客 2127

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

signal.h是C标准函数库中的信号处理部分,定义了程序执行时如何处理不同的信号。信号用作进程间通信,报告异常行为(如除零)、用户的一些按键组合(如同时按下Ctrl与C键,产生信号SIGINT)。C++中的对应头文件是csignal。 C语言标准定义了6个信号,都定义在signal.h头文件中: (1). SIGABRT:程序异常中止,如调用abort函数。 (2). SIGFPE:算术运...

网络资源是无限的 2万+

linux信号含义

windows下有消息,那么相对Linxu下的是信号,每个信号都有一个名字,这些名字都是以SIG开头(signal的缩写),这些信号宏都被定义在了signal.h这些头文件中,每一个宏(正整数)代表一个信号,这里需要特别说明,没有编号为0(空信号)的信号,在linux下通过命令 kill -l 可以查看到所有的信号量。 如: user@user-virtual-machine:~$ kill

Mi一下好困的博客 1528

信号、signal 函数、sigaction 函数

1.信号的基本概念 2.利用 kill 命令发送信号 3.信号处理的相关动作 4.信号与 signal 函数 4.1 signal 函数示例一 4.2 signal 函数示例二 5.利用 sigaction 函数进行信号处理 6.利用信号处理技术消灭僵尸进程

脚踏实地,仰望星空 3210

「c++」signal函数

「c++」signal函数

HAICHANG1105的博客 2976

Signal ()函数详细介绍

signal()函数理解 在 这个头文件中。 signal(参数1,参数2); 参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。 参数2:我们处理的方式(是系统默认还是忽略还是捕获)。 一般有3中方式进行操作。 (1)eg: signal(SIGINT ,SIG_ING ); //SI

沉淀 1765

Linux 信号详解一(signal函数)

信号列表 SIGABRT 进程停止运行 6 SIGALRM 警告钟 SIGFPE 算述运算例外 SIGHUP 系统挂断 SIGILL 非法指令 SIGINT 终端中断 2 SIGKILL 停止进程(此信号不能被忽略或捕获) SIGPIPE 向没有读的管道写入数据 ...

weixin_34313182的博客 905
上一篇: C语言main函数参数
下一篇: 深入理解Java内存模型(三)——顺序一致性
熬夜是一种修养
博客等级 码龄9年 12粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值