【探索Linux】—— 强大的命令行工具 P.16(进程信号 —— 信号产生 | 信号发送 | 核心转储)

news2024/11/17 14:40:56

在这里插入图片描述

阅读导航

  • 引言
  • 一、概念
    • (1)基本概念
    • (2)kill -l命令(察看系统定义的信号列表)
  • 二、产生信号
    • (1)通过终端按键产生信号
      • -- 信号产生
      • -- Core Dump(核心转储)
    • (2)调用系统函数向进程发信号
      • kill( ) 函数
      • abort( ) 函数
    • (3) 由软件条件产生信号
      • alarm( ) 函数
    • (4)硬件异常产生信号
  • 温馨提示

引言

在现代社会中,信号无处不在。我们的生活充满了各种各样的信号,它们指引着我们前进的方向,使我们能够了解周围环境的变化。正如在计算机编程中一样,Linux进程信号也是一种重要的信号,它们扮演着相似的角色。

想象一下,在繁忙的城市街道上行驶,交通信号灯是我们最熟悉的信号之一。当红灯亮起时,我们知道需要停下来等待;而绿灯的出现则意味着可以继续前行。这些信号通过明确的方式向司机传达信息,确保道路上的交通有序进行。

类似地,Linux进程信号也是一种用于进程间通信和控制的手段。它们是操作系统通过发送特定信号给进程来通知其发生了某种事件或请求进行某种操作的机制。这些信号可以用于中断进程、终止进程、重新启动进程以及执行其他与进程相关的操作

Linux进程信号的产生和发送是一个复杂而精密的过程,它涉及操作系统内部的多个组件和机制。深入理解信号的工作原理对于编写高效、稳定的程序至关重要。通过掌握信号的概念和使用方法,我们可以更好地利用操作系统提供的功能,实现各种任务的灵活管理和交互。

在本文中,我们将探讨Linux进程信号的基本概念、信号的产生方式以及如何通过编程发送信号给进程。通过深入了解信号的工作原理,我们将能够更好地理解操作系统的内部机制,并在编写程序时更加灵活地利用信号来实现我们的目标。让我们一起踏上这个关于Linux进程信号的精彩探索之旅吧!

一、概念

(1)基本概念

Linux中的信号是一种软件中断。当操作系统发送一个信号给一个进程时,该进程会立即停止正在执行的任务,并跳转到一个特定的信号处理函数中进行处理。信号可以用于中断进程、终止进程、重新启动进程以及执行其他与进程相关的操作。

(2)kill -l命令(察看系统定义的信号列表)

在这里插入图片描述
Linux中共有64个不同的信号,它们被分为两类:标准信号和实时信号。标准信号的编号从1到31,实时信号的编号从32到64。每个信号都有一个唯一的名称和一个对应的数字编号,例如SIGINT表示中断信号,其编号为2。

在 Linux 中,这些宏定义通常可以在 <signal.h> 头文件中找到。每个信号都有一个编号和一个宏定义名称。

对于信号的产生条件和默认处理动作的详细说明,可以通过查看 signal(7) 的手册页来获取。可以使用以下命令来查看:

man 7 signal

这将打开关于信号的手册页,其中包含了关于信号产生条件、默认处理动作以及如何使用 signal() 函数进行自定义信号处理的详细说明。
在这里插入图片描述
在Linux中,我们可以通过编写信号处理函数来对信号进行处理。信号处理函数是在接收到信号后自动调用的函数,用于处理信号并执行相应的操作。当一个信号产生时,操作系统通常会暂停当前进程的执行,保存进程的状态,然后跳转到信号处理函数中执行相应的操作。

二、产生信号

Linux中的信号可以由以下三种方式产生

  1. 用户按下终端键(如Ctrl+C),操作系统会将一个SIGINT信号发送给前台进程组中的所有进程;

  2. 进程调用kill()系统调用,向指定进程或进程组发送信号;

  3. 操作系统本身发现了某些异常情况,如进程访问非法内存地址、除零错误等,就会向进程发送相应的信号。

(1)通过终端按键产生信号

– 信号产生

在终端中,你可以通过按下特定的组合键来向正在运行的程序发送信号。其中最常用的是以下几个:

  1. Ctrl+C:产生 SIGINT 信号,通常用于中断当前程序的执行。
  2. Ctrl+Z:产生 SIGTSTP 信号,通常用于挂起当前程序的执行。
  3. Ctrl+\:产生 SIGQUIT 信号,通常用于请求当前程序退出,并生成 core 文件。

通过在终端中按下这些组合键,你可以模拟产生这些信号,从而触发相应的信号处理动作。

– Core Dump(核心转储)

Core Dump(核心转储)是指在程序异常终止时,将程序的内存状态转储到一个特殊文件中。这个文件称为 core 文件,它包含了程序在崩溃前的内存映像。

当程序发生严重错误、段错误(Segmentation Fault)或其他类似的问题导致程序崩溃时,操作系统会生成一个 core 文件。这个文件可以被用于调试程序,通过分析 core 文件可以了解程序崩溃时的内存状态,有助于定位和修复错误。

core 文件的生成受到操作系统的控制,通常在以下情况下会生成 core 文件:

  1. 程序显式地调用 abort() 函数。
  2. 程序收到 SIGQUIT 或 SIGILL 等信号。
  3. 程序发生段错误(Segmentation Fault)。

默认情况下,core 文件的生成是被启用的。但是,有时可能已经被禁用或限制了大小。你可以使用以下命令来检查系统的 core 文件配置:

ulimit -a | grep core

在这里插入图片描述

如果输出中显示了 core file size,则表示 core 文件生成是启用的,并且会显示 core 文件的最大大小限制。

(2)调用系统函数向进程发信号

kill( ) 函数

要向进程发送信号,可以使用系统函数kill()kill()函数的原型如下:

#include <sys/types.h>
#include <signal.h>

int kill(pid_t pid, int sig);

其中,pid参数是目标进程的进程ID(PID),sig参数是要发送的信号编号。

以下是一个示例代码,演示如何使用kill()函数向进程发送信号:

#include <sys/types.h>
#include <signal.h>
#include <stdio.h>

int main() {
    pid_t pid = 1234; // 替换为目标进程的实际进程ID

    if (kill(pid, SIGINT) == 0) 
    {
        printf("成功发送信号给进程 %d\n", pid);
    } 
    else 
    {
        perror("发送信号失败");
    }

    return 0;
}

在上面的示例中,kill()函数用来向进程ID为pid的进程发送SIGINT信号(中断信号)。如果函数返回值为0,则表示成功发送信号。否则,可以使用perror()函数输出错误信息。

abort( ) 函数

abort()是一个C标准库函数,用于引发程序的异常终止。调用abort()函数会导致程序生成core文件(如果core文件生成被启用)并退出。abort()函数的原型如下:

#include <stdlib.h>

void abort(void);

abort()函数会向进程发送SIGABRT信号,这是一个特殊的终止信号,通常用于表示程序遇到了严重错误,并主动请求终止。

当调用abort()函数时,系统会进行一系列的处理操作,包括终止当前进程、生成core文件、关闭文件等。然后,程序将立即退出。

以下是一个示例代码,演示了如何使用abort()函数:

#include <stdio.h>
#include <stdlib.h>

int main() {
    printf("开始执行程序\n");

    // 模拟一个错误条件
    int divisor = 0;
    if (divisor == 0) {
        printf("除数为零,程序终止\n");
        abort();
    }

    // 正常执行的代码
    printf("正常执行的代码\n");

    return 0;
}

在上面的示例中,当除数为零时,程序调用了abort()函数导致程序异常终止。在这种情况下,将会输出"除数为零,程序终止",然后程序会生成core文件(如果core文件生成被启用)并退出。

(3) 由软件条件产生信号

在Linux中,由软件条件产生信号是通过使用信号处理函数来实现的。信号是一种软件中断,用于通知进程发生了某个事件。下面是一个简单的示例代码,展示了如何在Linux中由软件条件产生信号:

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

void signal_handler(int signal_num) {
    printf("Received signal: %d\n", signal_num);
}

int main() {
    // 注册信号处理函数
    signal(SIGUSR1, signal_handler);

    printf("Waiting for signal...\n");
    sleep(10);  // 模拟程序执行的一段时间

    return 0;
}

在上面的示例中,首先使用signal函数注册了一个信号处理函数signal_handler,该函数会在接收到SIGUSR1信号时被调用。然后,程序进入休眠状态sleep(10),等待信号的到来。可以使用以下命令发送SIGUSR1信号给该程序:

$ kill -SIGUSR1 <pid>

其中,<pid>是运行该程序的进程ID。当程序接收到信号后,就会执行信号处理函数,并打印出接收到的信号编号。

alarm( ) 函数

在Linux中,alarm()函数可以用来设置一个定时器,当定时器到时后,会给进程发送一个SIGALRM信号。alarm()函数的原型如下:

unsigned int alarm(unsigned int seconds);

其中,seconds参数指定了定时器的时间,单位是秒。如果seconds为0,则会取消之前设置的定时器。

以下是一个简单的示例代码,展示了如何使用alarm()函数来实现定时器功能:

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

void signal_handler(int signal_num) {
    printf("Received signal: %d\n", signal_num);
}

int main() {
    // 注册信号处理函数
    signal(SIGALRM, signal_handler);

    // 设置定时器,时间为5秒
    alarm(5);

    printf("Waiting for alarm...\n");
    pause();  // 等待信号的到来

    return 0;
}

在上面的代码中,首先注册了一个信号处理函数signal_handler,当接收到SIGALRM信号时就会执行该函数。然后使用alarm()函数设置定时器,时间为5秒。接着,程序进入休眠状态pause(),等待信号的到来。可以看到,在5秒后,程序会收到SIGALRM信号,并执行对应的信号处理函数。

需要注意的是,alarm()函数只能设置一个全局定时器,如果需要同时多个定时器,可以考虑使用setitimer()函数。此外,调用alarm()函数会取消之前设置的定时器,如果需要保留之前的定时器,可以使用setitimer()ITIMER_VIRTUALITIMER_REAL选项。

(4)硬件异常产生信号

在Linux中,硬件异常通常由操作系统内核检测到,并通过信号来通知相关进程。下面是一些常见的硬件异常和相应的信号:

  1. 除零异常(Divide-by-Zero):当执行除法操作时除数为零时触发的异常。操作系统会向进程发送SIGFPE信号,表示浮点异常。

  2. 非法指令异常(Illegal Instruction):当执行非法或无效的指令时触发的异常。操作系统会向进程发送SIGILL信号,表示非法指令。

  3. 段错误异常(Segmentation Fault):当进程访问了未分配给它的内存空间或者试图向只读内存写入数据时触发的异常。操作系统会向进程发送SIGSEGV信号,表示段错误。

  4. 总线错误异常(Bus Error):当进程试图访问非法的物理内存地址或者对不支持的对齐方式进行访问时触发的异常。操作系统会向进程发送SIGBUS信号,表示总线错误。

  5. 浮点异常(Floating-Point Exception):当执行浮点计算出现溢出、下溢或非法操作时触发的异常。操作系统会向进程发送SIGFPE信号,表示浮点异常。

这些硬件异常信号可以被进程捕获并进行相应的处理。通过设置信号处理函数,进程可以在收到硬件异常信号时采取适当的措施,如记录日志、恢复状态或退出程序等。

🚨注意硬件异常的处理通常是由操作系统内核负责的,应用程序通常无法直接控制硬件异常的触发和处理。应用程序可以通过注册信号处理函数来处理与硬件异常相关的信号,但具体的处理方式受限于操作系统和硬件平台的约束

温馨提示

感谢您对博主文章的关注与支持!如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
在这里插入图片描述

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

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

相关文章

基于Loki + Promtail + Grafana 搭建 Nginx 日志监控

文章目录 引言第一部分&#xff1a;Loki 简介与安装1.1 Loki 简介1.2 Loki 安装1.2.1 下载 Loki1.2.2 安装 Loki 1.3 启动 Loki 第二部分&#xff1a;Promtail 简介与安装2.1 Promtail 简介2.2 Promtail 安装2.2.1 下载 Promtail2.2.2 安装 Promtail 2.3 启动 Promtail 第三部分…

图论——二部图及其算法

什么是二部图 二部图的判定 例子1 任选一个节点染成红色 红色的邻居染成蓝色 蓝色邻居染成红色 例子2 这个不是二部图 无权二部图的最大匹配

PS去除图片上的文字。

问题描述&#xff1a;如何使用PS去除图片上的文字。 解决办法&#xff1a; 第一步&#xff1a;使用框选命令选中文字所在区域&#xff0c;如下图所示。 第二步&#xff0c;右键选择填充&#xff0c;选择内容填充即可。 第三步&#xff0c;文字去除效果如下。

python数学建模之Numpy、Pandas学习与应用介绍

文章目录 Numpy学习1 Numpy 介绍与应用1-1Numpy是什么 2 NumPy Ndarray 对象3 Numpy 数据类型4 Numpy 数组属性 Pandas学习1 pandas新增数据列2 Pandas数据统计函数3 Pandas对缺失值的处理 总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品P…

Java核心知识点整理大全14-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…

linux系统中select函数的用法实现

前言&#xff1a; select机制已经被很多人都讲解过&#xff0c;select使用起来也不是特别难&#xff0c;为什么还要花时间再次讲解select机制&#xff1f; 在回答这个问题之前&#xff0c;我们先问一下自己&#xff0c;是否有足够的信心保证在使用select编程时不出错&#xf…

yolov5利用yaml文件生成模型

一、yolov5的yaml文件构成 yaml文件如下图 不论是backbone还是head&#xff0c;每一行都由一个列表组成&#xff0c;列表里面有四个元素&#xff0c;另外&#xff0c;还有两个参数depth和width。在搭建模型的时候&#xff0c;会利用每一行的信息生成一个模块&#xff0c;并按照…

Word文档排版常见问题汇总(公式图表乱码、Visio插图空白区域)

Word文档排版常见问题汇总 1. 公式图表乱码2. Visio图插入Word中&#xff0c;图中空白区域大3. visio 画图插入Word 中只显示{代码}&#xff0c;不显示图片4.部分期刊要求 行连续编码&#xff08;The manuscript text must be line-numbered continuously&#xff09;5. 要求图…

cocos浏览器测试正常,但到了抖音、微信小游戏事件无响应、无法操作的bug原因及解决办法

本篇文章主要讲解&#xff1a;cocos游戏引擎&#xff0c;浏览器测试时弹出框好好的&#xff0c;无任何报错&#xff0c;构建项目到抖音、微信小游戏时无法弹出弹出框&#xff0c;但又无报错的问题原因及解决办法。 日期&#xff1a;2023年11月25日 作者&#xff1a;任聪聪 问题…

移动家庭云电脑只能24小时不关机

DD转换Linux也不行&#xff0c;北京地区套餐为家庭云电脑畅享版月包&#xff0c;客服回复目前只能设置24小时不关机。 24小时必须关机这是很严重的问题&#xff0c;不能随时保持在线连接&#xff0c;也没有公网IP。

一篇文章完成Hbase入门

文章目录 一、简介1、数据模型结构2、物理存储结构3、数据模型4、基本架构 二、安装1、下载解压安装包2、修改配置文件3、启动服务(单机、集群)4、配置高可用(HA) 三、命令行操作1、建表2、新增/更新数据3、查看表数据4、删除数据5、修改默认保存的数据版本 四、架构1、RegionS…

吴恩达《机器学习》10-4-10-5:诊断偏差和方差、正则化和偏差/方差

一、诊断偏差和方差 在机器学习中&#xff0c;诊断偏差和方差是改进模型性能的关键步骤。通过了解这两个概念&#xff0c;能够判断算法的问题究竟是欠拟合还是过拟合&#xff0c;从而有针对性地调整模型。 1. 概念理解 偏差&#xff08;Bias&#xff09;&#xff1a; 表示模…

Springboot3+vue3从0到1开发实战项目(一)

一. 可以在本项目里面自由发挥拓展 二. 知识整合项目使用到的技术 后端开发 &#xff1a; Validation, Mybatis,Redis, Junit,SpringBoot3 &#xff0c;mysql&#xff0c;Swagger, JDK17 &#xff0c;JWT&#xff0c;项目部署 前端开发&#xff1a; Vue3&#xff0c;Vite&am…

RK3568驱动指南|第七篇-设备树-第70章 参考文档:设备树bindings

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

微信公众号快速接入大模型

今天找到一个可以快速将大模型接入公众号的方法&#xff0c;现在跟大家分享一下。 如何让微信公众号接入大模型文案创作能力&#xff0c;实现类似ChatGPT文案创作功能。方法其实很简单&#xff0c;只需打开地址“http://www.botaigc.cn:8900/mpauth”&#xff0c;用微信扫码即可…

5G NSA注册解析及图标显示方案

5G NSA注册解析及图标显示方案 1. NSA注册流程解析1.1 NSA注册流程1.2 NAS消息信元变化1.3 UE能力信元变化1.3.1 第一次UE能力查询1.3.2 后续UE能力查询1.3.3 UE能力过滤器解析 1.4 UE测量配置1.5 SCG添加消息解析1.6 SCG添加成功1.7 Split Bearer承载的建立1.8 NR协议查询索引…

Linux | 重定向 | 文件概念 | 查看文件 | 查看时间 | 查找文件 | zip

Linux | 重定向 | 文件概念 | 查看文件 | 查看时间 | 查找文件 | zip 文章目录 Linux | 重定向 | 文件概念 | 查看文件 | 查看时间 | 查找文件 | zip一、more1.1 输出重定向>和>>1.2 输入重定向< 二、 再谈一切皆文件三、less指令【重要】四、head指令五、tail指令…

长寿秘诀揭秘!7个长寿特征,能占1个都是福!

一项涵盖了约72万人的美国退伍老兵的全面性研究&#xff0c;揭露了有这7个特征的人&#xff0c;更易长寿&#xff0c;寿命甚至可延长20多年。 卡尔伊利诺医学院退伍军人事务部健康科学专家研究指出&#xff0c;在中年以后&#xff0c;有这7个特征的人多数比较长寿&#xff0c;…

人工智能 -- 神经网络

1、什么是神经网络 什么是人工智能&#xff1f;通俗来讲&#xff0c;就是让机器能像人一样思考。这个无需解释太多&#xff0c;因为通过各种科幻电影我们已经对人工智能很熟悉了。大家现在感兴趣的应该是——如何实现人工智能&#xff1f; 从1956年夏季首次提出“人工智能”这…

算法基础之滑动窗口

滑动窗口 主要思想&#xff1a;单调队列 保证队列中下标跨度始终为3个数 q[N]维护数组中元素下标 方便判断窗口大小 #include<iostream>#include<algorithm>using namespace std;const int N1000010;int a[N],q[N];int n,k,hh,tt-1;int main(){cin>>n>…