Linux 信号的产生

news2024/9/20 11:43:57

1. 概念

在Linux系统中,信号是一种进程间通信的机制,它允许操作系统或其他进程向特定进程发送异步通知。我们可以通过命令 kill -l来查看信号的种类:

Linux系统中的信号可以分为两大类:传统信号和实时信号。从上图可以看出它们分为两个区间:[1, 31] 和[34, 64],无32和33号信号,[1, 31] 区间为传统信号共有31种,当进程收到传统信号后,可以自己选择合适的时候处理;[34, 64]为实时信号共有31种,当进程收到实时信号后,立马处理。

以下是一些常见信号的简要说明:

  • SIGINT(2):用户通过Ctrl+C发送的中断信号,通常用于请求进程终止。
  • SIGQUIT(3):用户通过Ctrl+\发送的退出信号,通常用于请求进程终止并生成core dump。
  • SIGABRT(6):通过调用abort()函数产生的信号,用于异常终止程序。
  • SIGFPE(8):发生致命的算术运算错误时产生。
  • SIGKILL(9):用于立即强制终止进程的信号,不能被进程捕获、阻塞或忽略。
  • SIGSEGV(11):试图写入无效内存地址时产生。
  • SIGALRM(14):由alarm()函数设置的计时器到期时产生。
  • SIGSTOP(19):停止进程执行的信号,不能被进程捕获、阻塞或忽略。
  • SIGTSTP(20):由用户通过Ctrl+Z发送的暂停信号,可以被进程捕获和处理。

进程接收到信号后,有三种处理信号的方式:

  1. 忽略此信号
  2. 执行信号的默认处理函数
  3. 执行信号的自定义处理函数,这种方式也称为信号捕捉

前两种均为操作系统自带的方式,我们可以通过 man 7 signal 命令来查看这些处理行为:

  1. Term (Terminate):这是当一个信号没有被处理(即没有安装信号处理函数)时,信号的默认行为,收到信号的进程将被终止。例如,SIGTERM的默认行为是终止进程。

  2. Ign (Ignore):进程可以选择忽略一个信号,这意味着当信号到达时,进程将不会执行任何默认行为或自定义处理函数。

  3. Core:指的是在进程终止时生成core dump的行为。当进程因为某些信号(如SIGSEGV)而终止时,如果设置了对应的信号行为为core,系统将生成该进程在终止瞬间的内存快照,以便于后续的错误分析。

  4. Stop:指的是信号的默认行为或自定义动作是停止进程的执行。例如,SIGSTOP信号会使进程停止,且不能被进程捕获或忽略。其他可停止信号(如SIGTSTP)可以被进程捕获和处理。

  5. Cont (Continue):指当一个已停止的进程接收到继续信号(如SIGCONT)时,将恢复执行。进程从停止状态恢复到运行状态。

我们继续往下翻可以看到各种信号对应的默认行为。

接下来我们来介绍第三种信号处理的方式,即信号捕捉。需要使用到 signal 函数。signal 函数是C语言标准库中的一个函数,用于设置信号处理程序,当程序运行时接收到特定的信号,signal 函数允许开发者定义一个函数来响应这些信号。

其中,signum参数指定了要处理的信号编号,handler参数是一个指向信号处理函数的指针,该函数指针类型为 void (*)(int)。如果 handlerSIG_IGN,则信号将被忽略;如果为 SIG_DFL,则信号将采用默认的操作系统行为。

#include<iostream>
#include<signal.h>
using namespace std;
void handler(int signum)
{
    cout<<"received signal: "<<signum<< endl;
}
int main()
{
    signal(2,handler);
    while(1)
    {
        cout<<"waiting for signal..."<<endl;
        sleep(1);
    }
    return 0;
}

以上代码中,我们通过 signal(2, handler) 把2号信号的处理方式变成了执行函数handler。而从上文介绍我们了解到从键盘上按下 ctrl + C 可以发送2号SIGINT信号。

可以看到按下ctrl + C后,本来是发送2号信号时会直接终止进程,但修改处理行为后,现在输出receive signal: 2了。

3. 注意
1. ctrl +  C  产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行 , 这样 Shell 不必等待进程结束就可以接受新的命令, 启动新的进程。
2. Shell 可以同时运行一个前台进程和任意多个后台进程 , 只有前台进程才能接到像 ctrl +  C 这种控制键产生的信号。
3. 前台进程在运行过程中用户随时可能按下 Ctrl - C 而产生一个信号 , 也就是说该进程的用户空间代码执行到任何地方都有可能收到 SIGINT 信号而终止 , 所以信号相对于进程的控制流程来说是异步
(Asynchronous) 的。

2. 产生

信号可以由多种方式产生,包括硬件产生和软件产生。

软件产生

软件产生的信号指的是由进程自身或其他进程产生的信号,其可以通过系统调用实现,常用的系统调用包括 kill()raise()abort()alarm()

kill

kill函数是在Unix和类Unix系统中,包括Linux,用于向进程发送信号的系统调用。这个函数允许一个进程请求操作系统向另一个进程发送指定的信号,从而可以控制目标进程的行为,如终止进程、请求进程停止或继续执行等。

参数:

  • pid:目标进程的进程ID。如果pid为正数,则信号发送给指定的进程;如果pid为0,则信号发送给调用进程所属的进程组。
  • sig:准备发送的信号码。如果sig为0,则不发送信号,但会执行错误检查,通常用于检测目标进程是否存在。

返回值:

  • 返回0:发送信号成功
  • 返回-1:发送信号失败

void handler(int signum)
{
    cout<<"received signal: "<<signum<< endl;
    exit(1);
}
int main()
{
    pid_t pid = fork();
    if(pid == 0)//child
    {
        signal(2,handler);
        while(1)
        {
            cout<<"child process waiting for signal..."<<endl;
            sleep(1);
        }
    }
    sleep(5);
    kill(pid,2);//send signal to child process
    return 0;
}

代码示例如上,子进程等待信号,5秒后,父进程向子进程发出2号信号,子进程收到该信号并执行handler 函数,最终退出。

同时,我们也可以在 Shell 中使用 kill 命令,如下,其底层为调用 kill接口。

kill -sig pid

raise

参数:

  • sig:要发送的信号的编号

返回值:

  • 返回0:发送信号成功
  • 返回-1:发送信号失败

在Linux系统编程中,raise函数用于给当前进程发送一个信号,这个函数等效于kill(getpid(), sig)raise函数通常用于引发特定的信号处理程序,或者在需要立即响应信号的场景中使用。

void handler(int signum)
{
    cout << "received signal: " << signum << endl;
    exit(1);
}
int main()
{
    signal(2, handler);
    int cnt = 5;
    while (cnt--)
    {
        cout << "waiting for signal,cnt = " << cnt << endl;
        sleep(1);
    }
    raise(2);
    return 0;
}

代码示例如上,while 循环执行5秒后,进程给自己发出2号信号,进程收到该信号并执行handler 函数,最终退出。

abort

在Linux系统中,abort函数是一个用于立即终止程序执行的系统调用。它不仅终止程序,而且会生成一个core dump(如果系统配置允许),这有助于调试和理解程序崩溃时的状态。

abort函数被调用时,它会向调用进程发送SIGABRT信号,SIGABRT信号的值通常为6。如果这个信号没有被处理,则默认行为是终止进程并生成core dump,以便后续的错误分析。

core dump的概念

接下来我们来了解 core dump 是什么,core dump 是指当Linux或Unix-like系统中的程序因为异常或错误而崩溃时,操作系统会生成的一个包含了程序崩溃时内存映像的文件。这个文件通常包含了程序的寄存器状态、堆栈信息、内存管理信息等,可以用于调试目的,帮助开发者分析程序崩溃的原因。

代码示例:

int Div(int a, int b)
{
    if (b == 0)
        abort();
    return a / b;
}
int main()
{
    int a = 5, b = 0;
    cout << Div(a, b);
    return 0;
}

上述代码发生了除0错误,进而调用了 abort 函数,可我们并没有看到在当前目录下生成的core dump文件,这是因为生成core dump文件是要有条件的。

core dump文件的生成条件

core dump文件的生成不是自动的,它依赖于几个条件:

  • 当前用户的 ulimit -c+n(单位为byte) 设置必须允许生成core文件,或者设置为 ulimit -c unlimited 以移除大小限制。

  • 程序必须有权限在其当前工作目录中创建文件。

我们可以使用 ulimit -a 命令显示当前的所有资源限制。

我们可以看到 core file size 为 0,即当前我们不能创建core file,我们需要使用ulimit -c 命令设置core file size的大小进而能创建core file。

core dump文件的作用

core dump文件对于软件开发和维护至关重要,因为它们提供了程序崩溃时的详细快照。通过使用调试工具(如GDB)分析​​​​​​​core dump文件,开发者可以追溯程序崩溃时的函数调用堆栈,检查变量的状态,从而定位到导致崩溃的代码行和潜在的错误。

alarm

alarm函数用于设置一个定时器,该定时器会在指定的秒数后向进程发送SIGALRM信号(14)。

参数:

  • seconds:在seconds秒后发送信号

返回值:

  • 如果之前有还没响的闹钟:取消上一次的闹钟,并返回上一次闹钟的剩余秒数
  • 如果之前没有闹钟了:返回0

硬件产生

硬件产生的信号通常是由于用户输入或系统异常触发的。例如,当用户在终端上按下组合键如Ctrl+C时,会产生SIGINT信号,用于中断当前运行的进程。此外,硬件异常,如非法内存访问,也会导致内核生成相应的信号并发送给发生事件的进程。 

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

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

相关文章

代码随想录算法训练营第40天 动态规划part07| 题目: 198.打家劫舍 、 213.打家劫舍II 、 337.打家劫舍III

代码随想录算法训练营第40天 动态规划part07| 题目&#xff1a; 198.打家劫舍 、 213.打家劫舍II 、37.打家劫舍III 文章来源&#xff1a;代码随想录 题目名称&#xff1a;198.打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff…

【随手笔记】485

1. 基础知识 2线&#xff0c;半双工&#xff0c;多点通信 电压差传递信号 逻辑 1&#xff1a; 两线间电压差为 2V ~ 6V 逻辑0 &#xff1a; 两线间电压差为-2V ~ -6V 10米最高速率达 35Mbps 1200米 速率达100Kbps 抗共模干扰能力强 一般支持32个节点 推荐使用点对点线型 总线…

IDEA开发HelloWorld程序

IDEA管理Java程序的结构 project&#xff08;项目、工程&#xff09;---project中可以创建多个modulemodule&#xff08;模块&#xff09;---module中可以创建多个packagepackage&#xff08;包&#xff09;---package中可以创建多个classclass&#xff08;类&#xff09;---c…

木牛科技PMO总监关沨受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 北京木牛领航科技有限公司PMO总监关沨女士受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“如何培养能打胜仗的项目经理”。大会将于10月26-27日在北京举办&#xff0c;主题为&a…

图神经网络在推荐系统中的应用综述

1 研究计划 了解推荐系统的研究背景和发展历程了解为什么推荐系统需要GNN了解基于GNN的推荐的关键挑战了解基于GNN的推荐的现有方法 2 完成情况 2.1推荐系统的研究背景和发展历程 随着各种服务和平台(如电子商务、短视频等)上信息的快速爆炸&#xff0c;推荐系统在缓解信息…

UWA支持鸿蒙HarmonyOS NEXT

华为在开发者大会上&#xff0c;宣布了鸿蒙HarmonyOS NEXT将仅支持鸿蒙内核和鸿蒙系统的应用&#xff0c;不再兼容安卓应用&#xff0c;这意味着它将构建一个全新且完全独立的生态系统。 为此&#xff0c;UWA也将在最新版的UWA SDK v2.5.0中支持鸿蒙HarmonyOS NEXT&#xff0c…

NLP三天入门大模型,我领先你好几个版本了

大模型时代下&#xff0c;nlp初学者需要怎么入门? 入门姿势简单粗暴:打一些必要的基础就跑步进入Transformera 大模型时代&#xff0c;传统的算法&#xff0c;像分词、词性标注&#xff0c;被替代得非常厉害&#xff0c;在入门阶段没必要花费太多精力在传统算法上面。 数学和…

强弱电的基本知识和区别

什么是弱电&#xff1a; 弱电一般是指直流电路或音频、视频线路、网络线路、电话线路&#xff0c;直流电压一般在36V以内。家用电器中的电话、电脑、电视机的信号输入&#xff08;有线电视线路&#xff09;、音响设备&#xff08;输出端线路&#xff09;等用电器均为弱电电气设…

IDEA Cody 插件实现原理

近年来&#xff0c;智能编程助手 在开发者日常工作中变得越来越重要。IDEA Cody 插件是 JetBrains 生态中一个重要的插件&#xff0c;它可以帮助开发者 快速生成代码、自动补全、并提供智能提示&#xff0c;从而大大提升开发效率。今天我们将深入探讨 Cody 插件的实现原理&…

Facebook隐私设置指南:如何更好地保护个人信息

在数字化时代&#xff0c;隐私保护成为了每个互联网用户面临的重要课题。Facebook&#xff0c;作为全球最大的社交网络平台之一&#xff0c;拥有庞大的用户基础和丰富的个人数据。因此&#xff0c;了解和管理Facebook的隐私设置对保护个人信息至关重要。本文将为您提供一份详细…

RTX 4090/RTX 4090D停产,为RTX 5090扫平“障碍”

原文转载修改自&#xff08;更多互联网新闻/搞机小知识&#xff09;&#xff1a; RTX 4090/4090D或于10月停产&#xff0c;为RTX 5090“登基”铺路 作为网络人均一代旗舰的RTX 4090至今也已发售近两年&#xff0c;说实在的&#xff0c;按老黄一贯的手法&#xff0c;也到了该落…

金属材质检测系统源码分享

金属材质检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

Docker 进入容器并运行命令的方法

目录 理解 Docker 容器的基本概念 使用 docker exec 进入运行中的容器 基本用法 常用选项解析 选项详解 实际案例演示 1. 进入容器的交互式 Shell 2. 在容器中运行单个命令 3. 以指定用户运行命令 4. 设置环境变量并运行命令 5. 指定工作目录 使用 docker attach 附…

Lingo求解器基本语法

Lingo是一款用于线性规划和整数规划的数学建模和求解软件&#xff0c;被广泛应用于运筹学、生产优化、供应链管理等领域。今天与大家一起来熟悉一下它的基本语法 Lingo基本语法 1、定义目标函数为MIN&#xff0c;MAX. 2、以一个分号“&#xff1b;”结尾。除SETS,ENDSETS,D…

我的AI工具箱Tauri版-VideoClipMixingCut视频批量混剪

本教程基于自研的AI工具箱Tauri版进行VideoClipMixingCut视频批量混剪。 VideoClipMixingCut视频批量混剪 是自研AI工具箱Tauri版中的一款强大工具&#xff0c;专为自动化视频批量混剪设计。该模块通过将预设的解说文稿与视频素材进行自动拼接生成混剪视频&#xff0c;适合需要…

企业展厅数字化变革:多媒体创新方案打造全新体验

相较于动态、形象的内容表达方式&#xff0c;传统展馆展厅已经无法满足观众的需求&#xff0c;所以数字化已经成为展厅升级转型的必然趋势&#xff0c;通过数字多媒体将展厅的内涵呈现出来&#xff0c;这便是展厅的特色&#xff0c;本文就来了解一下多媒体创新解决方案在企业展…

【TPAMI 2024】如何让模型在任何环境下都能胜出?领域泛化学习从单一到多元!

Out-of-Domain Generalization From a Single Source: An Uncertainty Quantification Approach 题目&#xff1a;单一源域的域外泛化&#xff1a;一种不确定性量化方法 作者&#xff1a;Xi Peng; Fengchun Qiao; Long Zhao 关注公众号&#xff1a;AI前沿速递&#xff0c;获取…

深度学习自编码器 - 收缩自编码器(CAE)篇

序言 在深度学习的浪潮中&#xff0c;收缩自编码器&#xff08; Compressive Autoencoder, CAE \text{Compressive Autoencoder, CAE} Compressive Autoencoder, CAE&#xff09;作为自编码器的一种高级形式&#xff0c;正逐步崭露头角。收缩自编码器在保留自编码器核心功能—…

RT-DETR改进策略:BackBone改进|Next-ViT主干赋能下的革命性改进

摘要 Next-ViT(下一代视觉Transformer)是专为解决传统ViT模型在工业部署中遇到的推理速度慢、计算复杂度高等问题而设计的。它巧妙地结合了高效的Next Convolution Block(NCB)和Next Transformer Block(NTB),通过创新的混合策略(NHS)堆叠这些模块,从而在各种视觉任务…

数据不出境------IP证书申请

数据不出境IP证书的申请流程主要涉及选择国内验签的SSL证书服务商、注册账号、选择证书类型、提交验证文件和等待签发等步骤。以下是具体说明&#xff1a; 选择服务商&#xff1a;需要选择一个提供国内验签服务的SSL证书供应商&#xff0c;如JoySSL&#xff0c;这些服务商通常具…