Linux信号学习三步走及知识脉络

ops/2024/10/19 5:26:18/

Linux信号学习三步走及知识脉络

在Linux系统中,信号(Signal)是一个非常重要的概念,它作为一种异步通知机制,用于通知进程发生了某些事件。信号的本质是软件层次上对中断机制的一种模拟,是进程间通信机制中唯一的异步通信方式。学习Linux信号,可以通过以下三步走,并打通相关的知识脉络。

一、信号的基本概念与分类

1. 信号的定义

信号,又称为软中断信号,是Linux系统响应某些条件而产生的一个事件。它是操作系统向一个进程或者线程发送的一种异步通知,用于通知该进程或线程某种事件已经发生,需要做出相应的处理。信号本质是一种异步通知机制,用户或操作系统通过发送信号来通知进程某些事情已经发生,进程可以进行后续处理。

2. 信号的产生

信号可以由多种方式产生,包括:

  • 通过终端按键产生信号:例如,在终端上按Ctrl+C键通常产生中断信号(SIGINT),终止进程。
  • 调用系统函数向进程发信号:如kill()函数、raise()函数等。
  • 由软件条件产生信号:例如,使用alarm()函数设置的闹钟超时后会产生SIGALRM信号。
  • 硬件异常产生信号:如除数为0、无效的内存引用等,这些条件通常由硬件检测到,并通知内核,然后内核为发生此错误的进程发送相应的信号。

3. 信号的分类

Linux系统支持多种信号,大致可以分为两大类:非实时信号(也称为不可靠信号)和实时信号(也称为可靠信号)。非实时信号的值范围是1到31,是从UNIX系统中继承下来的;实时信号的值范围是34到64。非实时信号不支持排队,可能会丢失,而实时信号支持排队,可以确保信号按顺序处理。

可以使用kill -l命令查看系统中支持的所有信号及其编号和名称。每种信号都有其特定的含义和默认处理动作,例如,SIGKILL(信号值为9)的默认处理动作是立即终止进程,且不能被捕捉或忽略。

二、信号的处理与捕捉

1. 信号的处理方式

当进程接收到信号时,可以采取以下三种方式之一来处理信号:

  • 忽略信号:大部分信号都可以被忽略,但SIGSTOP和SIGKILL两个信号除外,因为它们是给超级用户提供杀掉或停止任何进程的手段。
  • 执行默认处理动作:系统为每种信号都定义了一个默认的处理动作,如终止进程、生成core dump文件等。
  • 捕捉信号:进程可以注册一个信号处理函数来捕捉特定的信号,并在接收到该信号时执行相应的处理逻辑。

2. 信号的捕捉

在Linux中,可以通过signal()函数或sigaction()函数来设置信号处理函数。signal()函数是UNIX系统的遗留接口,它相对简单但功能有限;而sigaction()函数提供了更丰富的功能,是更推荐使用的接口。

sigaction()函数允许进程为特定的信号指定一个处理函数,并可以修改信号的行为,如阻塞信号、查询信号等。其结构体sigaction包含了信号的处理函数、信号屏蔽字等信息。

示例代码

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>void sig_handler(int signum) {printf("Caught signal %d\n", signum);// 清理资源、关闭文件等操作exit(signum);
}int main() {struct sigaction act;act.sa_handler = sig_handler;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGINT, &act, NULL);while(1) {printf("Looping...\n");sleep(1);}return 0;
}

在这个例子中,我们为SIGINT信号设置了处理函数sig_handler,当进程接收到SIGINT信号时,会执行sig_handler函数,并打印出接收到的信号编号,然后退出程序。

3. 信号的阻塞与解除

进程可以选择阻塞某些信号,被阻塞的信号在产生时将保持在未决状态,直到进程解除对该信号的阻塞,才执行递达的动作。信号的阻塞和解除可以通过sigprocmask()函数来实现。

sigprocmask()函数允许进程指定一个新的信号屏蔽字(即阻塞哪些信号),并可以获取旧的信号屏蔽字。通过设置信号屏蔽字,进程可以控制哪些信号被阻塞,哪些信号被允许递达。

三、信号的保存与递达

1. 信号的保存

Linux内核为每个进程维护了与信号相关的数据结构,主要包括三张表:阻塞表(Block表)、未决表(Pending表)和处理函数表(Handler表)。

  • 阻塞表:一个位图,用于表示进程当前阻塞了哪些信号。
  • 未决表:同样是一个位图,用于表示进程当前有哪些信号处于未决状态。
  • 处理函数表:一个函数指针数组,用于表示当信号递达时应该执行的处理动作。

当信号产生时,内核会在进程控制块(PCB)的Pending表中设置对应信号位的值为1,表示该信号已经产生且处于未决状态。然后,内核会检查Block表,查看该信号是否被阻塞。如果被阻塞,则信号会保持在未决状态;如果没有被阻塞,则根据Handler表中的处理函数指针执行相应的处理动作。

2. 信号的递达

信号的递达是指信号从产生到被处理的过程。在Linux中,信号的递达通常是在内核态和用户态之间切换时进行的。当进程从内核态返回到用户态时,内核会检查待处理的信号,并根据信号的处理方式执行相应的动作。

如果进程为某个信号设置了自定义处理函数,则在信号递达时,内核会切换到用户态并调用该处理函数。如果进程选择忽略信号或执行默认处理动作,则内核会根据相应的规则来处理信号。

四、总结与知识脉络

学习Linux信号需要打通以下知识脉络:

  1. 信号的基本概念:理解信号的定义、产生方式、分类以及默认处理动作。
  2. 信号的处理与捕捉:掌握如何通过signal()函数或sigaction()函数来设置信号处理函数,并了解信号捕捉的机制和细节。
  3. 信号的阻塞与解除:了解如何通过sigprocmask()函数来设置和修改进程的信号屏蔽字,从而控制哪些信号被阻塞或允许递达。
  4. 信号的保存与递达:理解Linux内核如何为进程维护信号相关的数据结构,以及信号从产生到递达的过程。

通过这三步走,可以系统地学习Linux信号的相关知识,并在实际编程中灵活运用信号机制来实现进程间的异步通信和错误处理。


http://www.ppmy.cn/ops/118156.html

相关文章

光伏发电生活废水处理设备产地货源

诸城市鑫淼环保小编带大家了解一下光伏发电生活废水处理设备产地货源 由A级生化厌氧池、二级O级生化好氧池、污泥浓缩池、清水排放池和人孔&#xff08;观察孔&#xff09;组成。工厂直接供应地埋式一体化污水处理设备&#xff0c;经济实用&#xff0c;节省设备投资和设备运行费…

局域网中实现一对一视频聊天(附源码)

一、什么是webRTC WebRTC&#xff08;Web Real-Time Communication&#xff09;是一项支持网页浏览器进行实时语音对话或视频对话的API技术。它允许直接在浏览器中实现点对点&#xff08;Peer-to-Peer&#xff0c;P2P&#xff09;的通信&#xff0c;而无需任何插件或第三方软件…

每天学习一个技术栈 ——【Django Channels】篇(2)

前篇&#xff1a;每天学习一个技术栈 ——【Django Channels】篇&#xff08;1&#xff09;-CSDN博客 四、结合Celery实现异步任务 在本节中&#xff0c;我们将介绍如何使用Celery处理实时聊天应用中的异步任务。Celery能够帮助我们将耗时的任务&#xff08;如保存聊天记录&a…

科技赋能环保:静电与光解技术在油烟净化中的卓越应用

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 随着环保政策的不断升级&#xff0c;餐饮行业的油烟治理成为重要课题。油烟净化器的技术革新不仅提升了净化效率&#xff0c;…

Chainlit集成LlamaIndex实现知识库高级检索(从小到大递归检索器)

检索原理 从小到大的检索是指我们在切割文档时可以同时设置多个不同的chunk_size的颗粒度&#xff0c;比如我们可以同时设置chunk_size为128&#xff0c;256&#xff0c;512即按这三个不同的颗粒度对同时对所有文档都切割一遍。利用LlamaIndex中的RecursiveRetriever递归检索器…

PHP爬虫:获取商品销量详情API的利器

在电子商务时代&#xff0c;商品的销量数据对于商家来说至关重要。它不仅能够帮助商家了解市场动态&#xff0c;还能够指导库存管理和营销策略。PHP作为一种流行的服务器端脚本语言&#xff0c;结合其强大的HTTP请求处理能力&#xff0c;可以有效地用于编写爬虫程序&#xff0c…

python/requests库的使用/爬虫基础工具/

requests 是一个 Python 库&#xff0c;它允许你发送 HTTP 请求。这个库需要单独安装&#xff0c;因为它不是 Python 标准库的一部分 1.让我们安装requests 在控制台运行 pip install requests 使用 requests 发送请求 1.GET 请求&#xff1a; import requestsresponse …

S1_02_第一章_计算机网络概述

1、什么是计算机网络 那么,到底什么是计算机网络呢?用通信设备和线路将处于不同地理位置、操作相对独立的多 台计算机连接起来,并配置相应的系统和应用软件,在原本各自独立的计算机之间实现软硬件资源 共享和信息传递等形成的系统就是计算机网络。 1.1、计算机网络的功能 1&…