Linux系统编程(信号处理机制)

文章目录

  • 前言
  • 一、中断,异常,信号的区别
  • 二、信号在Linux中的标识
  • 三、信号处理相关函数
  • 四、代码实验
  • 总结


前言

本篇文章我们来讲解信号的处理机制,信号处理在Linux操作系统中必不可少,这一点值得大家注意,信号又会与中断,异常一起讨论,那么下面我们就来看看到底什么是信号吧。

一、中断,异常,信号的区别

中断、异常和信号是计算机系统中的三个相关但不完全相同的概念。它们在发生的时机、触发方式和处理机制上有所不同。

中断(Interrupt):

1.中断是由硬件发出的一种信号,用于打断处理器当前的执行流程,以响应特定的硬件事件或请求。

2.中断可以来自外部设备(例如键盘、鼠标、硬盘控制器)或系统内部(例如定时器、异常或错误)。

3.当发生中断时,处理器会暂停当前的执行并切换到中断处理程序来处理中断事件,然后在处理完中断后回到原来的执行上下文。

异常(Exception):
1.异常是在程序执行期间发生的事件或错误条件,可能导致程序的正常流程中断。

2.异常可以是由硬件错误(例如除零错误、无效的内存访问)或软件错误(例如逻辑错误、非法操作)触发的错误情况。

3.异常通常是同步的,也就是说,它们在执行特定的指令时发生,并由程序自身或相关硬件直接处理。

4.异常的处理方式通常由编程语言、操作系统或硬件定义,可以通过异常处理机制(例如 try-catch 块)捕获和处理。

信号(Signal):

1.信号是一种在软件层面上由操作系统或进程间通信机制发送的异步通知。

2.信号可以用于通知进程发生的特定事件,如用户操作(例如按下 Ctrl+C),操作系统事件(例如进程终止),或由其他进程发送的消息。

3.信号是在进程执行期间以异步方式发出的,可以打断当前的执行流程。

4.信号通常用于处理外部事件或异常情况,例如捕获异常,终止进程或重新启动进程等。

总结:

1.中断是由硬件发出的打断处理器当前执行流程的信号,用于响应硬件事件。

2.异常是在程序执行期间发生的事件或错误条件,用于响应特定的错误情况。

3.信号是在软件层面上由操作系统或进程间通信机制发送的异步通知,用于处理外部事件或异常情况。

它们在触发方式、处理机制和使用场景上有所不同,但都可以用于在计算机系统中处理特定的事件、错误和异常情况。

二、信号在Linux中的标识

每个信号都由一个唯一的数字标识符来表示,这些数字被称为信号编号。

信号编号是整数值,通常用正整数来表示,例如SIGINT、SIGTERM等。这些信号编号定义在系统头文件 <signal.h> 中,并在C语言中使用 SIG 前缀。

以下是一些常见的信号编号及其含义:

SIGHUP (1): 终端挂起或控制进程终止。

SIGINT (2): 使用键盘输入的中断信号。

SIGQUIT (3): 使用键盘输入的退出信号。

SIGILL (4): 非法指令。

SIGABRT (6): 异常终止。

SIGFPE (8): 浮点异常。

SIGKILL (9): 强制进程终止。

SIGALRM (14): 闹钟超时。

SIGTERM (15): 终止请求。

三、信号处理相关函数

signal()

函数原型:

void (*signal(int signum, void (*handler)(int)))(int)

功能:signal() 函数用于注册信号处理函数,指定在接收到特定信号时要执行的操作。

参数:

signum:要捕获和处理的信号编号。
handler:指向信号处理函数的指针,可以是自定义函数或内置的信号处理函数。
返回值:返回一个函数指针,指向以前注册的信号处理函数。

raise()

函数原型:

int raise(int sig)

功能:raise() 函数用于在当前进程内部生成信号。它向当前进程发送指定的信号。
参数:

sig:要发送的信号编号。
返回值:成功时返回0,否则返回一个非零值。

kill()

函数原型:

int kill(pid_t pid, int sig)

功能:kill() 函数用于向指定进程或进程组发送信号。

参数:
pid:要发送信号的进程的进程ID(PID)。可以是正整数值,表示单个进程的PID,也可以是负整数值,表示进程组的PID(将信号发送给该进程组中的所有进程)。
sig:要发送的信号编号。
返回值:成功时返回0,否则返回一个非零值。

这些函数可以一起使用来进行信号的处理。首先,使用 signal() 函数注册信号处理函数,指定接收到特定信号时要执行的操作。然后,可以使用 raise() 函数在当前进程中生成信号,或使用 kill() 函数向其他进程发送信号。

需要注意的是,不同的信号有不同的含义和用途。要正确使用信号处理函数和相关函数,需要了解不同的信号及其处理方式。可以通过查阅相关文档或系统头文件 <signal.h> 了解所有可用的信号及其意义。

四、代码实验

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

void signal_handle(int sig)
{
    printf("sig = %d\n", sig);
}

int main(void)
{

    signal(SIGINT, signal_handle);

    while(1)
    {
        sleep(1);
    }

    return 0;
}

执行效果:
在这里插入图片描述
按下ctrl加c后被信号处理函数捕捉到了,并且打印了信号的数值。

下面的代码演示了怎么样使用信号进行线程之间通信。

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

void signal_handle(int sig)
{
    printf("sig = %d\n", sig);
}

int main(void)
{

    signal(40, signal_handle);

    while(1)
    {
        sleep(1);
    }

    return 0;
}
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
    pid_t pid = atoi(argv[1]);

    kill(pid, 40);

    raise(SIGINT);

    while(1)
    {
        sleep(1);
    }

    return 0;
}

总结

本篇文章就讲解到这里,大家看完后可以好好实验一下。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DOM事件

文章目录 1.注册事件&#xff08;绑定事件&#xff09;1.1 注册事件概述1.2 addEventListener 事件监听方式1.3 attachEvent 事件监听方式1.4 注册事件兼容性解决方案 2.删除事件&#xff08;解绑事件&#xff09;2.1 删除事件的方式2.2 删除事件兼容性解决方案 3.DOM 事件流4.…

机器学习实践(2.1)LightGBM分类任务

前言 LightGBM也属于Boosting集成学习模型(还有前面文章的XGBoost)&#xff0c;LightGBM和XGBoost同为机器学习的集大成者。相比越来越流行的深度神经网络&#xff0c;LightGBM和XGBoost能更好的处理表格数据&#xff0c;并具有更强的可解释性&#xff0c;还具有易于调参、输入…

Kafka的基本概念及其关键原理

Apache Kafka是一种分布式事件存储和流处理平台。该项目旨在提供一个统一的、高吞吐量、低延迟的平台&#xff0c;用于处理实时数据流。 •Kafka可以通过Kafka Connect连接到外部系统&#xff08;用于数据导入/导出&#xff09;&#xff0c;并提供Kafka Streams库用于流处理应用…

回溯算法组合问题之77组合

题目&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 题目链接&#xff1a;77. 组合 - 力扣&#xff08;LeetCode&#xff09; 示例&#xff1a; 解法&#xff1a; 回溯法三部曲&#xff1a; &a…

简易评分系统

目录 一、实验目的 二、操作环境 三、实验内容和过程 1.实验内容 2.代码 2.1 用户验证功能 2.2 菜单函数 2.3 评分功能 四、结果分析 总体的输出结果&#xff1a; 保存文件成功截图&#xff1a; 五、小结 一、实验目的 1.巩固和提高学生学过的基础理论和专业知识&am…

55 # 实现可写流

先在 LinkedList.js 给链表添加一个移除方法 class Node {constructor(element, next) {this.element element;this.next next;} }class LinkedList {constructor() {this.head null; // 链表的头this.size 0; // 链表长度}// 可以直接在尾部添加内容&#xff0c;或者根据…

java贪心算法案例

1.零钱找回问题 这个问题在我们的日常生活中就更加普遍了。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元&#xff0c;至少要用多少张纸币&#xff1f;用贪心算法的思想&#xff0c;很显然&#xff0c;每一步…

计算机网络 day7 扫描IP脚本 - 路由器 - ping某网址的过程

目录 network 和 NetworkManager关系&#xff1a; 实验&#xff1a;编写一个扫描脚本&#xff0c;知道本局域网里哪些ip在使用&#xff0c;哪些没有使用&#xff1f; 使用的ip对应的mac地址都要显示出来 计算机程序执行的两种不同方式&#xff1a; shell语言编写扫描脚本 …

漏洞攻击 --- TCP -- 半开攻击、RST攻击

TCP半开攻击&#xff08;半连接攻击&#xff09; --- syn攻击 &#xff08;1&#xff09;定义&#xff1a; sys 攻击数据是DOS攻击的一种&#xff0c;利用TCP协议缺陷&#xff0c;发送大量的半连接请求&#xff0c;耗费CPU和内存资源&#xff0c;发生在TCP三次握手中。 A向B…

为什么ConcurrentHashMap不允许插入null值而HashMap可以?

为什么ConcurrentHashMap不允许插入null值而HashMap可以&#xff1f; 文章目录 为什么ConcurrentHashMap不允许插入null值而HashMap可以&#xff1f;HashMap源码ConcurrentHashMap源码为什么ConcurrentHashMap需要加空值校验呢&#xff1f;二义性问题测试代码代码分析测试结果结…

LangChain + Embedding + Chromdb,关联使用ChatGLM的本地搭建训练平台教程

一.介绍 OpenAI 在国内用户注册会遇到各种阻力&#xff0c;目前可行的方法是使用本地数据集的功能实现联网搜索并给出回答&#xff0c;提炼出TXT、WORD 文档里的内容。 现在主流的技术是基于强大的第三方开源库&#xff1a;LangChain 。 文档地址&#xff1a;&#x1f99c;…

win11安装redis步骤详解

文章目录 一、redis的安装与下载1、下载2、解压3、启动redis4、测试是否安装成功 二、将redis加入到windows的服务中三、常用的redis服务命令 安装可参考的资料&#xff1a;https://www.runoob.com/redis/redis-install.html 一、redis的安装与下载 1、下载 下载地址&#xf…

提示工程师:如何写好Prompt

提示工程由来 提示工程是一门相对较新的学科&#xff0c;用于开发和优化提示以有效地将语言模型 (LM) 用于各种应用程序和研究主题。 研究人员使用提示工程来提高 LLM 在广泛的常见和复杂任务&#xff08;例如问题回答和算术推理&#xff09;上的能力。 开发人员使用提示工程…

120、仿真-51单片机温湿度光照强度C02 LCD1602 报警设计(Proteus仿真+程序+元器件清单等)

方案选择 单片机的选择 方案一&#xff1a;STM32系列单片机控制&#xff0c;该型号单片机为LQFP44封装&#xff0c;内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ&#xff0c;在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节…

【Docker】Docker安装与操作

docker的安装与命令 一、安装 docker1. 安装依赖包2. 信息查看 二、Docker 镜像操作1. 搜索镜像2. 获取镜像3. 镜像加速下载4. 查看镜像相关信息5. 删除镜像6. 上传镜像7. 存出和载入镜像 三、Docker 容器操作1. 创建容器2. 查看容器3. 启动容器4. 停止容器5. 进入容器6. 容器与…

SpringBoot整合SpringCloudStream3.1+版本Kafka

SpringBoot整合SpringCloudStream3.1版本Kafka 下一节直通车 SpringBoot整合SpringCloudStream3.1版本的Kafka死信队列 为什么用SpringCloudStream3.1 Springcloud架构提供&#xff0c;基于spring生态能够快速切换市面上常见的MQ产品3.1后使用配置文件的形式定义channel&am…

# Linux下替换删除文件中的颜色等控制字符的方法

Linux下替换删除文件中的颜色等控制字符的方法 文章目录 Linux下替换删除文件中的颜色等控制字符的方法1 Linux下的控制字符&#xff08;显示的文字并不是他本身&#xff09;&#xff1a;2 颜色字符范例&#xff1a;3 替换4 最后 我们在shell编程显示输出时&#xff0c;会定义文…

Linux的时间函数

2023年7月19日&#xff0c;周三下午 我今天基于GitHub搭建了自己的博客网站&#xff0c;欢迎大家来我的个人博客网站阅读我的博客 巨龙之路的GitHub个人博客 (julongzhilu.github.io) 目录 time函数原型使用方法ctime函数原型使用方法疑惑gmtime、 localtime函数原型什么是分…

WEB:FlatScience

背景知识 sql注入 SQLite数据库知识 SQLite3注入方法 题目 用dirsearch进行扫描&#xff0c;下面几个关键目录&#xff1a;robots.txt&#xff0c;login.php&#xff0c;admin.php&#xff0c;剩下的目录就是一些pdf格式的论文了 一个一个访问并查看源代码&#xff0c;在查看l…

常用API学习06(Java)

Biglnteger public BigInteger(int num, Random rnd) 获取随机大整数&#xff0c;范围&#xff1a;[0~2的num次方-1] public BigInteger(String val) 获取指定的大整数 public BigInteger(String val, int radix) 获取指定进制的大整数 public static BigInteg…