【LinuxC语言】信号的基本概念与基本使用

news2024/11/21 0:17:37

文章目录

  • 前言
  • 一、信号的概念
  • 二、信号的使用
    • 2.1 基本的信号类型
    • 2.2 signal函数
  • 总结


前言

在Linux环境下,信号是一种用于通知进程发生了某种事件的机制。这些事件可能是由操作系统、其他进程或进程本身触发的。对于C语言编程者来说,理解信号的基本概念和使用方法是非常重要的,因为它们可以用来实现进程间通信、处理异常情况以及实现一些高级功能。


一、信号的概念

信号是一种在UNIX和类UNIX操作系统中用于通知进程发生事件的机制。它们是一种异步通信方式,可以由操作系统、其他进程或者进程本身发送给目标进程。信号的本质是一种软件中断,它提供了一种简单而有效的进程间通信方式,用于处理异步事件。

每个信号都有一个唯一的数字标识符,称为信号编号。例如,常见的信号包括SIGINT(表示终端中断,通常由Ctrl+C发送)、SIGTERM(表示终止请求)和SIGSEGV(表示无效的内存访问)。操作系统提供了一套标准的信号,同时也允许用户自定义信号。

信号可以用于多种用途,包括但不限于:
处理用户输入:例如,在终端中按下Ctrl+C会发送SIGINT信号,通常用于终止正在运行的程序。
错误处理:某些异常情况,如无效的内存访问或除以零,会触发相应的信号,进而允许程序进行错误处理或者优雅地退出。
进程间通信:进程可以向其他进程发送信号,从而实现简单的进程间通信。
进程控制:通过发送不同的信号,可以控制目标进程的行为,例如启动、停止或重新加载。
总之,信号是UNIX系统中一种重要的进程间通信机制,它允许进程在某些事件发生时得到及时通知,并采取相应的措施。

想象一下你在做一件事情,突然间有人拍了拍你的肩膀,告诉你:“快停下来!”这个拍肩膀的动作就好比是信号,而你停下来的反应就是信号的作用。

在计算机世界里,信号就像是操作系统或者其他程序发出的一种消息,告诉你的程序说:“发生了某件事情!”这件事情可能是用户按下了某个键,或者出现了程序出错的情况,等等。

所以,信号的本质就是一种通知机制,用来告诉程序发生了什么事情,程序可以根据不同的信号做出相应的处理,就像你收到不同的消息,会有不同的反应一样。

二、信号的使用

2.1 基本的信号类型

以下是Linux系统中的全部信号及其相应的编号:

信号名称信号编号说明
SIGHUP1终端挂起或控制进程终止。
SIGINT2由键盘引起的中断,通常是用户按下Ctrl+C。
SIGQUIT3由键盘引起的退出,通常是用户按下Ctrl+\。
SIGILL4非法指令。
SIGTRAP5追踪或断点陷。
SIGABRT6异常终止条件,通常由abort函数发出。
SIGBUS7总线错误。
SIGFPE8浮点异常。
SIGKILL9无条件终止,无法被捕获或忽略。
SIGUSR110用户自定义信号1。
SIGSEGV11无效的内存引用。
SIGUSR212用户自定义信号2。
SIGPIPE13向无读取进程的管道写数据时触发。
SIGALRM14定时器到期。
SIGTERM15终止请求,用于优雅地终止进程。
SIGSTKFLT16协处理器栈错误。
SIGCHLD17子进程状态改变。
SIGCONT18继续执行停止的进程。
SIGSTOP19停止进程。
SIGTSTP20交互停止信号,通常由用户按下Ctrl+Z。
SIGTTIN21后台进程尝试读取标准输入。
SIGTTOU22后台进程尝试写入标准输出。
SIGURG23紧急情况的socket条件。
SIGXCPU24超出CPU时间限制。
SIGXFSZ25超出文件大小限制。
SIGVTALRM26虚拟定时器到期。
SIGPROF27进程控制定时器到期。
SIGWINCH28窗口大小调整。
SIGIO29异步IO事件。
SIGPWR30电源故障。
SIGSYS31非法系统调用。

2.2 signal函数

signal函数原型:

#include <signal.h>

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

作用:

signal函数用于设置对特定信号的处理方式。通过该函数,可以指定当接收到指定信号时所要执行的处理函数。

参数:

  • signum:要设置处理方式的信号编号。
  • handler:处理该信号的函数指针,可以是一个函数或者SIG_IGN(忽略该信号)或SIG_DFL(使用默认处理方式)。

返回值:

signal函数返回一个函数指针,指向之前的信号处理函数。如果发生错误,则返回SIG_ERR(-1)。

示例代码:

下面是一个示例代码,演示了如何使用signal函数来设置对SIGINT信号的处理方式:

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

// 自定义信号处理函数
void sigint_handler(int signum) {
    printf("接收到SIGINT信号,即将退出...\n");
    // 这里可以执行一些清理操作
    exit(0);
}

int main() {
    // 注册SIGINT信号的处理函数
    if (signal(SIGINT, sigint_handler) == SIG_ERR) {
        perror("无法注册SIGINT信号处理函数");
        return 1;
    }

    printf("按下Ctrl+C试试看!\n");

    // 无限循环,等待信号
    while (1) {
        sleep(1);
    }

    return 0;
}

在这里插入图片描述

在这个示例中,我们使用signal函数将SIGINT信号的处理方式设置为我们自定义的函数sigint_handler。当程序接收到SIGINT信号(即用户按下Ctrl+C)时,将会调用该函数来处理信号。


总结

通过学习信号的基本概念和使用方法,我们可以更好地编写可靠的Linux应用程序。通过注册信号处理函数,我们可以定义在收到特定信号时所采取的行动,从而实现进程的自定义行为。然而,要注意信号处理函数的编写应尽量简洁高效,避免在其中执行过多的操作,以确保信号处理过程尽可能快速地完成。此外,要注意在多线程程序中使用信号时可能引发的竞态条件和其他并发问题,因此在这种情况下需要额外的注意和谨慎。

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

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

相关文章

使用 ORPO 微调 Llama 3

原文地址&#xff1a;https://towardsdatascience.com/fine-tune-llama-3-with-orpo-56cfab2f9ada 更便宜、更快的统一微调技术 2024 年 4 月 19 日 ORPO 是一种新的令人兴奋的微调技术&#xff0c;它将传统的监督微调和偏好校准阶段合并为一个过程。这减少了训练所需的计算…

8.MyBatis 操作数据库(进阶)

文章目录 1.动态SQL插入1.1使用注解方式插入数据1.2使用xml方式插入数据1.3何时用注解何时用xml&#xff1f;1.4使用SQL查询中有多个and时&#xff0c;如何自动去除多余and1.4.1方法一&#xff1a;删除and之后的代码如图所示&#xff0c;再次运行1.4.2方法二&#xff1a;加上tr…

C语言——文件相关操作

2.什么是文件 3.文件的打开和关闭 4.文件的顺序读写 5.文件的随机读写 6.文本文件和二进制文件 7.文件读取结束的判定 8.文件缓冲区 一、文件相关介绍 1、为什么使用文件 文件用于永久存储数据。通过使用文件&#xff0c;我们可以在程序关闭后保存数据&#xff0c;以便将来…

Springboot图片上传【本地+oss】

文章目录 1 前端组件页面2 本地上传3 上传到阿里云oss3.1申请开通账号&#xff0c;做好先导准备3.2 开始使用 1 前端组件页面 使用的VueElement组件 在线cdn引入&#xff1a; <script src"https://cdn.bootcdn.net/ajax/libs/vue/2.7.16/vue.js"></script&…

Simulink|【免费】虚拟同步发电机(VSG)惯量阻尼自适应控制仿真模型

目录 主要内容 仿真模型要点 2.1 整体仿真模型 2.2 电压电流双闭环模块 2.3 SVPWM调制策略 2.4 无功电压模块 2.5 自适应控制策略及算法 部分结果 下载链接 主要内容 该模型为simulink仿真模型&#xff0c;主要实现的内容如下&#xff1a; 随着风力发电、…

免费APP分发平台 - 一个指南和解析

数字化时代的APP分发平台 随着数字化进程的加速免费APP分发平台 - 一个指南和解析&#xff0c;移动应用&#xff08;APP&#xff09;市场正迅速扩大。在这个充满竞争的市场中免费APP分发平台 - 一个指南和解析&#xff0c;一个优秀的APP分发平台能够帮助开发者和商家更有效地触…

用keras识别狗狗

一、需求场景 从照片从识别出狗狗 from keras.applications.resnet50 import ResNet50 from keras.preprocessing import image from keras.applications.resnet50 import preprocess_input, decode_predictions import numpy as np# 加载预训练的ResNet50模型 model ResNet5…

网络知识点之—QoS

QoS&#xff08;Quality of Service&#xff0c;服务质量&#xff09;指一个网络能够利用各种基础技术&#xff0c;为指定的网络通信提供更好的服务能力&#xff0c;是网络的一种安全机制&#xff0c; 是用来解决网络延迟和阻塞等问题的一种技术。QoS的保证对于容量有限的网络来…

【matlab基础知识】(三)二维曲线绘制plot

x[-pi:0.0001:pi]; 选择较小步距 ysin(tan(x))-tan(sin(x));plot(x,y) 条件和函数值做一个点乘 x[-2:0.02:2];y1.1*sign(x).*(abs(x)>1.1)x.*(abs(x)<1.1);plot(x,y) 颜色&#xff0c;线形&#xff0c;曲线上的标志 由于0.01cosx波动太小&#xff0c;所以plotyy绘制多…

C语言 | Leetcode C语言题解之第64题最小路径和

题目&#xff1a; 题解&#xff1a; int minPathSum(int** grid, int gridSize, int* gridColSize) {int rows gridSize, columns gridColSize[0];if (rows 0 || columns 0) {return 0;}int dp[rows][columns];dp[0][0] grid[0][0];for (int i 1; i < rows; i) {dp[i…

【吃透Java手写】- Spring(上)-启动-扫描-依赖注入-初始化-后置处理器

【吃透Java手写】Spring&#xff08;上&#xff09;启动-扫描-依赖注入-初始化-后置处理器 1 准备工作1.1 创建自己的Spring容器类1.2 创建自己的配置类 ComponentScan1.3 ComponentScan1.3.1 Retention1.3.2 Target 1.4 用户类UserService Component1.5 Component1.6 测试类 2…

STM32——WWDG(窗口看门狗)

技术笔记&#xff01; 1.WWDG&#xff08;窗口看门狗&#xff09;简介 本质&#xff1a;能产生系统复位信号和提前唤醒中断的计数器。 特性&#xff1a; 递减的计数器&#xff1b; 当递减计数器值从 0x40减到0x3F时复位&#xff08;即T6位跳变到0&#xff09;&#xff1b; …

GPT-ArcGIS数据处理、空间分析、可视化及多案例综合应用

在数字化和智能化的浪潮中&#xff0c;GIS&#xff08;地理信息系统&#xff09;和GPT&#xff08;生成式预训练模型&#xff09;的结合正日益成为推动科研、城市规划、环境监测等领域发展的关键技术。GIS以其强大的空间数据处理、先进的空间分析工具、灵活的地图制作与可视化能…

OpenCV 实现重新映射(53)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 实现霍夫圆变换(52) 下一篇 :OpenCV实现仿射变换(54) 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 一个。使用 OpenCV 函数 cv&#xff1a;&#xff1a;remap 实现简…

mysql-sql-练习题-4-标记(排名 条件判断)

标记 标记找规律连续登录2-7天用户建表排名找规律 最大连胜次数建表多次排名 找规律输出更多数据 标记计数 百分比 标记找规律 连续登录2-7天用户 建表 create table continuous_login(user_id1 integer comment 用户id,date_login date comment 登陆日期 ) comment 用户登录…

一加12/11/10/Ace2/Ace3手机上锁回锁BL无限重启黑屏9008模式救砖

一加12/11/10/Ace2/Ace3手机官方都支持解锁BL&#xff0c;搞机的用户也比较多&#xff0c;相对于其他品牌来说&#xff0c;并没有做出限制&#xff0c;这也可能是搞机党最后的救命稻草。而厌倦了root搞机的用户&#xff0c;就习惯性回锁BL&#xff0c;希望彻底变回官方原来的样…

约瑟夫问题新解法

前言 又碰到了约瑟夫问题&#xff0c;这样的题目本来用环形链表模拟的话就能做出来。然而&#xff0c;最近新学习了一种做法&#xff0c;实在是有点震惊到我了。无论是思路上&#xff0c;还是代码量上&#xff0c;都是那么的精彩。就想也震惊一下其他人。谁能想到原来模拟出来四…

Go-变量

可以理解为一个昵称 以后这个昵称就代指这些信息 var sg string "czy" 声明赋值 package mainimport "fmt"func main() {var sg string "陈政洋"fmt.Println(sg)var age int 73fmt.Println(age)var flag bool truefmt.Println(flag) } …

【JVM】内存调优——内存泄漏、内存溢出

内存调优 什么是内存泄漏、内存泄漏&#xff1f; 内存泄漏&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;这个对象就不会被垃圾回收器回收。内存溢出&#xff1a;内存的使用量超过了Java虚拟机可以分配的上限&#xff…

ARP欺骗使局域网内设备断网

一、实验准备 kali系统&#xff1a;可使用虚拟机软件模拟 kali虚拟机镜像链接&#xff1a;https://www.kali.org/get-kali/#kali-virtual-machines 注意虚拟机网络适配器采用桥接模式 局域网内存在指定断网的设备 二、实验步骤 打开kali系统命令行&#xff1a;ctrlaltt可快…