【Linux】【信号操作】汇总整理

news2024/11/13 5:58:14

信号(Signals)是操作系统中用于通知进程发生特定事件的一种机制。信号可以由软件或硬件触发,并且可以被进程捕获和处理。以下是信号的相关概念、常见信号列表、信号处理以及相关API的汇总整理。

97cbf753f11d42ddb031b5e91ea75deb.jpeg

信号概述

信号是操作系统向进程发出的通知,用于响应各种事件,如用户输入、定时器到期、异常情况等。信号可以被忽略、捕获或默认处理。

常见信号列表

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

  • SIGINT (2):终端中断信号,通常由Ctrl+C触发。
  • SIGTERM (15):终止信号,通常由kill命令发送。
  • SIGKILL (9):强制终止信号,无法被捕捉或忽略。
  • SIGQUIT (3):退出信号,通常由Ctrl+\触发,产生核心转储文件。
  • SIGABRT (6):程序异常终止信号,通常由abort()函数触发。
  • SIGSEGV (11):段错误信号,通常由无效内存访问触发。
  • SIGCHLD (17):子进程结束信号,用于通知父进程子进程已经结束。
  • SIGPIPE (13):写入断开的管道或套接字信号。
  • SIGALRM (14):定时器信号,由alarm()函数触发。
  • SIGUSR1 (10) 和 SIGUSR2 (12):用户定义信号,通常用于进程间通信。
  • SIGSTOP (17):停止信号,无法被捕捉或忽略。
  • SIGCONT (18):继续信号,用于恢复被停止的进程。
  • SIGTSTP (20):终端停止信号,通常由Ctrl+Z触发。
  • SIGTTIN (21) 和 SIGTTOU (22):后台进程试图读取或写入终端信号。

信号处理

信号处理包括三种主要方式:

  1. 默认动作:操作系统默认的动作,如终止进程。
  2. 忽略:进程忽略该信号。
  3. 捕获:进程捕获信号,并通过信号处理函数进行处理。

信号处理API

定义信号处理函数

  • signal()
    • sighandler_t signal(int signum, sighandler_t handler): 设置信号处理函数。
    • 参数signum指定信号编号,handler指定信号处理函数。

捕获信号

  • sigaction()
    • int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact): 设置信号处理函数和信号行为。
    • 参数signum指定信号编号,act指定新的信号处理行为,oldact用于返回旧的行为。

忽略信号

  • sigignore()
    • void sigignore(int signum): 忽略指定的信号。

检查信号集

  • sigemptyset()
    • void sigemptyset(sigset_t *set): 清空信号集。
  • sigfillset()
    • void sigfillset(sigset_t *set): 将信号集设置为包含所有信号。
  • sigaddset()
    • int sigaddset(sigset_t *set, int signo): 添加信号到信号集。
  • sigdelset()
    • int sigdelset(sigset_t *set, int signo): 从信号集中删除信号。
  • sigismember()
    • int sigismember(const sigset_t *set, int signo): 检查信号是否在信号集中。

等待信号

  • sigwait()
    • int sigwait(const sigset_t *set, int *sig): 等待信号集中的任意信号。
  • sigwaitinfo()
    • int sigwaitinfo(const sigset_t *set, siginfo_t *info): 等待信号集中的任意信号,并返回信号信息。
  • sigtimedwait()
    • siginfo_t *sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *timeout): 在指定时间内等待信号集中的任意信号。

发送信号

  • kill()
    • int kill(pid_t pid, int sig): 发送信号给指定的进程。
  • raise()
    • int raise(int sig): 发送信号给当前进程。
  • syscall()
    • int syscall(int number, ...): 用于调用系统调用,可以用来发送信号。

示例代码

以下是一个简单的示例,展示如何在 Linux 系统上使用 C 语言捕获SIGINT信号,并打印出相应的信息:

1#include <stdio.h>
2#include <signal.h>
3#include <unistd.h>
4
5void sigint_handler(int sig) {
6    printf("捕获到 SIGINT 信号\n");
7}
8
9int main() {
10    // 设置信号处理函数
11    signal(SIGINT, sigint_handler);
12
13    // 无限循环,等待信号
14    while (1) {
15        sleep(1);  // 休眠一秒,以便捕获信号
16    }
17
18    return 0;
19}

注意事项

  • 信号处理函数不能执行耗时的操作,因为这会导致进程长时间处于不可中断的状态。
  • 信号处理函数不能直接调用可能导致阻塞的函数,如read()write()等,而应该使用sigprocmask()来管理信号屏蔽。
  • 信号处理函数应当尽可能简短,避免使用全局变量以减少竞态条件的风险。
  • 信号处理函数必须是异步安全的。
  • 有些信号是不可捕获或不可忽略的,如SIGKILLSIGSTOP

信号是操作系统中一种非常强大的机制,用于处理各种异常和事件。理解信号及其处理方式对于编写健壮的多进程或多线程程序非常重要。

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

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

相关文章

必备的计算机软件专业资料汇总,包括:计算机专业实习报告,计算机毕业设计成品(含源码和论文1900套)

大学期间必备的计算机软件专业资料汇总&#xff0c;包括&#xff1a;计算机专业实习报告&#xff08;58篇&#xff09;、计算机毕业设计成品&#xff08;含源码和论文&#xff0c;1900多套&#xff0c;包括C语言/PHP/VB/java/JSP/Andorid/Python/微信小程序等&#xff09;、HTM…

业务模块部署

一、部署前端 1.1 window部署 下载业务模块前端包。 &#xff08;此包为耐威迪公司发布&#xff0c;请联系耐威迪客服或售后获得&#xff09; 包名为&#xff1a;业务-xxxx-business &#xff08;注&#xff1a;xxxx为发布版本号&#xff09; 此文件部署位置为&#xff1a;……

使用kalibr_calibration标定相机(realsense)和imu(h7min)

vslam-evaluation/VINS/Installation documentation/4.IMU和相机联合标定kalibr_calibration.md at master DroidAITech/vslam-evaluation GitHub 目录 1.kalibr安装 1.1安装依赖项 1.2创建工作空间 1.3下载kalibr并编译 1.4设置环境变量 2.准备标定板 3.配置驱动和打…

Java | Leetcode Java题解之第551题学生出勤记录I

题目&#xff1a; 题解&#xff1a; class Solution {public boolean checkRecord(String s) {int absents 0, lates 0;int n s.length();for (int i 0; i < n; i) {char c s.charAt(i);if (c A) {absents;if (absents > 2) {return false;}}if (c L) {lates;if …

MATLAB课程:AI工具辅助编程——MATLAB+LLMs

给出一些可能有用的方法辅助大家写代码。 方法一&#xff1a;MATLAB软件LLM (不太懂配置的同学们为了省事可以主要用这个方法) 方法一特别针对本门MATLAB教学课程&#xff0c;给出一种辅助ai工具的操作指南。MATLAB中可以安装MatGPT插件&#xff0c;该插件通过调用ChatGPT的API…

腾讯混元3D-1.0:文本到三维和图像到三维生成的统一框架

虽然三维生成模型极大地改进了艺术家的工作流程&#xff0c;但现有的三维生成扩散模型存在生成速度慢、泛化能力差的问题。 为了解决这个问题&#xff0c;我们提出了一种名为 "Hunyuan3D-1.0 "的两阶段方法&#xff0c;包括精简版和标准版&#xff0c;均支持文本和图…

现代Web开发:Vue 3 组件化开发实战

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 现代Web开发&#xff1a;Vue 3 组件化开发实战 现代Web开发&#xff1a;Vue 3 组件化开发实战 现代Web开发&#xff1a;Vue 3 组…

VBA08-if语句

一、单行 If 语句 If x > 10 Then MsgBox "x is greater than 10"二、多行 If...Then...End If 语句 If x > 10 ThenMsgBox "x is greater than 10"y x 5 End If 三、If...Then...Else 语句 If condition Then 当条件为真时执行的代码块stateme…

深度学习中的感受野:从基础概念到多层次特征提取

在深度学习&#xff0c;特别是计算机视觉任务中&#xff0c;感受野&#xff08;Receptive Field&#xff09;是一个至关重要的概念。它指的是在神经网络中某一层的神经元在输入图像上“看到”的区域大小。感受野的大小影响了网络能捕捉的特征层级&#xff0c;从而决定了它的特征…

Jekins篇(搭建/安装/配置)

目录 一、环境准备 1. Jenkins安装和持续集成环境配置 2. 服务器列表 3. 安装环境 Jekins 环境 4. JDK 环境 5. Maven环境 6. Git环境 方法一&#xff1a;yum安装 二、JenKins 安装 1. JenKins 访问 2. jenkins 初始化配置 三、Jenkins 配置 1. 镜像配置 四、Mave…

ElasticSearch备考 -- 集群配置常见问题

一、集群开启xpack安全配置后无法启动 在配置文件中增加 xpack.security.enabled: true 后无法启动&#xff0c;日志中提示如下 Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security b…

C++ : STL容器(适配器)之stack、queue剖析

STL容器适配器之stack、queue剖析 一、stack、queue的接口&#xff08;一&#xff09;stack 接口说明&#xff08;二&#xff09;queue 接口说明 二、stack、queue的模拟实现&#xff08;一&#xff09;stack、queue是容器适配器stack、queue底层默认容器--deque1、deque概念及…

排序算法.

排序算法是最常用的一种算法.它解决的主要问题是在一定的时间复杂度和空间复杂度的条件下,对n个数按照一定的顺序进行排序.排序算法主要分为四大类,即插入类,交换类,选择类和归并类,不同的排序算法的时间复杂程度和空间复杂程度差别很大. 排序算法主要有以下几种: 1.插入类排…

window下安装rust 及 vscode配置

安装 安装mingw64 &#xff08;c语言环境 选择posix-ucrt&#xff09; ucrt:通用c运行时库配置mingw64/bin的路径到环境变量中在cmd窗口中输入命令 "gcc -v" 4. 下载Rust安装程序 安装 Rust - Rust 程序设计语言 5. 配置rustup和cargo目录 &#xff08;cargo是包管…

contos7.9 部署3节点 hadoop3.4 集群 非高可用

contos7.9 部署3节点 hadoop3.4 集群 非高可用 contos7.9 部署3节点 hadoop3.4 集群 非高可用环境信息服务器角色分配服务器配置服务器配置初始化 init_server.sh配置主机名映射所有节点配置 hosts文件 配置免密登录 hadoop 安装环境配置下载安装包下载 jdk1.8hadoop3.4 分发安…

M1M2 MAC安装windows11 虚拟机的全过程

M1/M2 MAC安装windows11 虚拟机的全过程 这两天折腾了一下windows11 arm架构的虚拟机&#xff0c;将途中遇到的坑总结一下。 1、虚拟机软件&#xff1a;vmware fusion 13.6 或者 parallel 19 &#xff1f; 结论是&#xff1a;用parellel 19。 这两个软件都安装过&#xff0…

【设计模式系列】享元模式(十五)

目录 一、什么是享元模式 二、享元模式的角色 三、享元模式的典型应用场景 四、享元模式在ThreadPoolExecutor中的应用 1. 享元对象&#xff08;Flyweight&#xff09;- 工作线程&#xff08;Worker&#xff09; 2. 享元工厂&#xff08;Flyweight Factory&#xff09;- …

国产化浪潮下,高科技企业如何选择合适的国产ftp软件方案?

高科技企业在数字化转型和创新发展中&#xff0c;数据资产扮演着越来越重要的角色。在研发过程中产生的实验数据、设计文档、测试结果等&#xff0c;专利、商标、版权之类的创新成果等&#xff0c;随着信息量急剧增加和安全威胁的复杂化&#xff0c;传统的FTP软件已经不能满足这…

大模型人工智能课程全栈完整学习路径

嘿&#xff0c;朋友们&#xff0c;今天我们聊点高级的——大模型人工智能课程的全栈学习路径。不过别慌&#xff0c;虽然听起来高大上&#xff0c;但咱们慢慢来。从零开始&#xff0c;一步步带你走进这个神奇的世界。喝杯咖啡&#xff0c;穿上最舒适的拖鞋&#xff0c;准备好踏…

【CUDA】认识CUDA

目录 一、CUDA编程 二、第一个CUDA程序 三、CUDA关键字 四、device管理 4.1 初始化 4.2 Runtime API查询GPU信息 4.3 决定最佳GPU CUDA C 编程指南CUDA C在线文档&#xff1a;CUDA C 编程指南 CUDA是并行计算的平台和类C编程模型&#xff0c;能很容易的实现并行算法。只…