【linux学习指南】初识Linux进程信号与使用

请添加图片描述

文章目录

  • 📝信号快速认识
    • 📶⽣活⻆度的信号
    • 📶 技术应⽤⻆度的信号
      • 🌉 前台进程(键盘)
      • 🌉⼀个系统函数
    • 📶信号概念
    • 📶查看信号
  • 🌠 信号处理
    • 🌉 忽略此信号
    • 🌉 执⾏该信号的默认处理动作。
    • 🌉 切换状态函数
  • 🚩总结


📝信号快速认识

📶⽣活⻆度的信号

  • 你在⽹上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时,你该怎么处理快递。也就是你能“识别快递”
  • 当快递员到了你楼下,你也收到快递到来的通知,但是你正在打游戏,需5min之后才能去取快递。那么在在这5min之内,你并没有下去去取快递,但是你是知道有快递到来了。也就是取快递的⾏为并不是⼀定要⽴即执⾏,可以理解成“在合适的时候去取”。
  • 在收到通知,再到你拿到快递期间,是有⼀个时间窗⼝的,在这段时间,你并没有拿到快递,但是你知道有⼀个快递已经来了。本质上是你“记住了有⼀个快递要去取”
  • 当你时间合适,顺利拿到快递之后,就要开始处理快递了。⽽处理快递⼀般⽅式有三种:
  • 1.执⾏默认动作(幸福的打开快递,使⽤商品)
  • 2.执⾏⾃定义动作(快递是零⻝,你要送给你你的⼥朋友)
    1. 忽略快递(快递拿上来之后,扔掉床头,继续开⼀把游戏)

快递到来的整个过程,对你来讲是异步的,你不能准确断定快递员什么时候给你打电话

基本结论

  1. 你怎么能识别信号呢?识别信号是内置的,进程识别信号,是内核程序员写的内置特性。
  2. 信号产⽣之后,你知道怎么处理吗?知道。如果信号没有产⽣,你知道怎么处理信号吗?知道。所以,信号的处理⽅法,在信号产⽣之前,已经准备好了。
  3. 处理信号,⽴即处理吗?我可能正在做优先级更⾼的事情,不会⽴即处理?什么时候?合适的时候。
  4. 信号到来|信号保存 |信号处理
  5. 怎么进⾏信号处理啊?a.默认b.忽略c.⾃定义,后续都叫做信号捕捉。
    在这里插入图片描述

📶 技术应⽤⻆度的信号

🌉 前台进程(键盘)

样例:
sig.cc:

#include <iostream>
#include <unistd.h>

int main()
{
    while(true)
    {
        std::cout<< "I am a process, I am wiat signal!" <<std::endl;
        sleep(1);
    }
    return 0;
}

Makefile:

BIN=sig
OBJS=$(SRCS:.cc=.o)
SRCS=$(shell ls *.cc)
CC=g++

$(BIN):$(OBJS)
	$(CC) -o $@ $^ -std=c++11

%.o:%.cc
	$(CC) -c $< -std=c++11

.PHONY:clean
clean:
	rm -f $(BIN) $(OBJS)

⽤⼾输⼊命令,在Shell下启动⼀个前台进程
⽤⼾按下程Ctrl+C
,这个键盘输⼊产⽣⼀个硬件中断,被OS获取,解释成信号,发送给⽬标前台进
前台进程因为收到信号,进⽽引起进程退出
在这里插入图片描述

🌉⼀个系统函数

指令:

man signal

而其实,ctrl+C的本质是向前台进程发送|SIGINT|2号信号,我们证明一下,这里需要引入一个系统调用函数

NAME
       signal - ANSI C signal handling

SYNOPSIS
       #include <signal.h>

       typedef void (*sighandler_t)(int);

       sighandler_t signal(int signum, sighandler_t handler);

参数说明:
signum:信号编号[后⾯解释,只需要知道是数字即可]
handler:函数指针,表⽰更改信号的处理动作,当收到对应的信号,就回调执⾏handler⽅法

在这里插入图片描述

代码:

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

void handler(int signumber)
{
    std::cout<<"我是:"<<getpid() <<",我获得一个信号:"<< signumber <<std::endl;
}

int main()
{
    std::cout<<"我是进程: "<<getpid() <<std::endl;
    signal(SIGINT/*2*/, handler);
    while(true)
    {
        std::cout<<"I am a process, I am waiting signal!"<< std::endl;
        sleep(1);
    }
    return 0;
}

在这里插入图片描述
思考:

  • 这⾥进程为什么不退出?
  • 这个例⼦能说明哪些问题?信号处理,是⾃⼰处理
  • 请将⽣活例⼦和Ctrl-C 信号处理过程相结合,解释⼀下信号处理过程?进程就是你,
    操作系统就是快递员,信号就是快递,发信号的过程就类似给你打电

注意:

  1. 要注意的是,signal函数仅仅是设置了特定信号的捕捉⾏为处理⽅式,并不是直接调⽤处理动作。如果后续特定信号没有产⽣,设置的捕捉函数永远也不会被调⽤!!
  2. Ctrl-C 产⽣的信号只能发给前台进程。⼀个命令后⾯加个&可以放到后台运⾏,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。
  3. Shell可以同时运⾏⼀个前台进程和任意多个后台进程,只有前台进程才能接到像Ctrl-C这种控制键产⽣的信号。
  4. 前台进程在运⾏过程中⽤⼾随时可能按下Ctrl-C⽽产⽣⼀个信号,也就是说该进程的⽤⼾空间代码执⾏到任何地⽅都有可能收到SIGINT 信号⽽终⽌,所以信号相对于进程的控制流程来说是异步(Asynchronous)的。
  5. 可以渗透&和nohup

📶信号概念

信号是进程之间事件异步通知的⼀种⽅式,属于软中断。

📶查看信号

每个信号都有⼀个编号和⼀个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有定义

#define SIGINT 2

在这里插入图片描述

在这里插入图片描述

编号34以上的是实时信号,本章只讨论编号34以下的信号,不讨论实时信号。这些信号各⾃在什么条件下产⽣,默认的处理动作是什么,在signal(7)中都有详细说明:

 man 7 signal

在这里插入图片描述

🌠 信号处理

(sigaction 函数稍后详细介绍),可选的处理动作有以下三种:

🌉 忽略此信号

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

void handler(int signumber)
{
    std::cout<<"我是:"<<getpid() <<",我获得一个信号:"<< signumber <<std::endl;
}

int main()
{
    std::cout<<"我是进程: "<<getpid() <<std::endl;
    signal(SIGINT/*2*/, SIG_IGN);// 设置忽略信号的宏
 
    while(true)
    {
        std::cout<<"I am a process, I am waiting signal!"<< std::endl;
        sleep(1);
    }
    return 0;
}

在这里插入图片描述

🌉 执⾏该信号的默认处理动作。

default默认行为SIG_DFL

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

void handler(int signumber)
{
    std::cout<<"我是:"<<getpid() <<",我获得一个信号:"<< signumber <<std::endl;
}

int main()
{
    std::cout<<"我是进程: "<<getpid() <<std::endl;
    // signal(SIGINT/*2*/, SIG_IGN);// 设置忽略信号的宏
    signal(SIGINT/*2*/, SIG_DFL);// 输⼊ctrl+c,进程退出,就是默认动作
 
 
    while(true)
    {
        std::cout<<"I am a process, I am waiting signal!"<< std::endl;
        sleep(1);
    }
    return 0;
}

在这里插入图片描述

🌉 切换状态函数

其实这里就是转到用户自定义的handler函数

提供⼀个信号处理函数,要求内核在处理该信号时切换到⽤⼾态执⾏这个处理函数,这种⽅式称为⾃定义捕捉(Catch)⼀个信号。

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

void signal_handler(int signum) {  
    // 自定义的信号处理函数  
    printf("Caught signal %d\n", signum);  
    // 在这里执行需要在用户态下运行的代码  
    // ...  
}  

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

    printf("Press Ctrl+C to send SIGINT signal...\n");  
    while (1) {  
        // 等待信号到来  
        pause();  
    }  

    return 0;  
}

注意看源码:

/* Fake signal functions.  */

#define	SIG_ERR	 ((__sighandler_t) -1)	/* Error return.  */
#define	SIG_DFL	 ((__sighandler_t)  0)	/* Default action.  */
#define	SIG_IGN	 ((__sighandler_t)  1)	/* Ignore signal.  */
/* Type of a signal handler.  */
typedef void (*__sighandler_t) (int);

让我们来逐一分析:

  1. #define SIG_ERR ((__sighandler_t) -1): 这个宏定义了 SIG_ERR,它被赋值为 -1,类型为 __sighandler_t。这通常用作 signal() 函数的返回值,表示发生错误。

  2. #define SIG_DFL ((__sighandler_t) 0): 这个宏定义了 SIG_DFL,它被赋值为 0,类型为 __sighandler_t。这用于指定使用默认的信号处理函数。

  3. #define SIG_IGN ((__sighandler_t) 1): 这个宏定义了 SIG_IGN,它被赋值为 1,类型为 __sighandler_t。这用于指定忽略该信号。

其实SIG_DFLSIG_IGN就是把0,1强转为函数指针类型


🚩总结

请添加图片描述

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

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

相关文章

蒙特卡洛方法(Monte Carlo,MC)

目录 1 序言 2 Monte Carlo法计算积分 3 最优化计算Monte Carlo法 1 序言 蒙特卡罗方法(Monte Carlo)是由冯诺依曼和乌拉姆等人发明的&#xff0c;“蒙特卡罗”这个名字是出自摩纳哥的蒙特卡罗赌场&#xff0c;这个方法是一类基于概率的方法的统称。是一种应用随机数来进行…

【ROS2】ROS2 构建系统 colcon 介绍、安装与使用

目录 一、ament 与 colcon二、colcon 模块化安装三、colcon 基本使用介绍3.1 常用命令构建工作空间清理构建结果构建特定的包指定构建系统并行构建扩展构建选项 3.2 其他命令列出所有可用的包忽略某些包查看colcon文档 一、ament 与 colcon ROS2采用了新的编译系统Ament&#…

Unity 2020、2021、2022、2023、6000下载安装

Unity 2020、2021、2022、2023、6000 下载安装 以Unity 6000.0.24fc1下载安装为例&#xff1a; 打开 https://unity.cn/ 优三缔 官方网站&#xff1b; 点击【产品列表】→点击【查看更多】→选择自己需要的版本→点【开始使用】 点击【从Unity Hub下载】 以Windows为例&am…

python自定义枚举类的试验与思考

一 现象 在python的3.4版本之前&#xff0c;是没有枚举类的。 所以&#xff0c;我自定义实现了一个enum类&#xff0c;目录如下&#xff1a; 代码如下&#xff1a; class enum(set):def __getattr__(self, name):if name in self:return nameraise AttributeErrorif __name_…

AIGC实践-使用Amazon Bedrock的SDXL模型进行文生图

一、Bedrock 简介 Amazon Bedrock 是 Amazon Web Services (AWS) 提供的一种生成式 AI 服务。通过 Bedrock&#xff0c;用户可以方便地使用多种基础模型&#xff08;Foundation Models&#xff09;&#xff0c;包括 OpenAI 的 GPT、Anthropic 的 Claude 等。这些模型可以用于各…

【MySQL】sql注入相关内容

【MySQL】sql注入相关内容 1. 为什么使用sql注入的时候&#xff0c;url传值的时候要使用–而不是– 使用–进行注释的时候需要在后面加一个空格才可以被认为是注释&#xff0c;url传值的过程中会将空格自动忽略&#xff0c;使用则可以在传输中保留为空格符号。&#xff08;同…

【YOLO】深入理解 CSP 瓶颈模块的变种:Bottleneck、C3、C3k、C2f 和 C3k2

深入理解 CSP 瓶颈模块的变种&#xff1a;Bottleneck、C3、C3k、C2f 和 C3k2 从 YOLOv3 到 YOLOv11&#xff0c;Ultralytics 团队结合当时的主流结构提出了各种适用于 YOLO 的模块&#xff0c;涵盖了不同的创新和优化思路&#xff0c;从而应对不断变化的目标检测需求。这些模块…

Redis中的数据结构详解

文章目录 Redis中的数据结构详解一、引言二、Redis 数据结构1、String&#xff08;字符串&#xff09;1.1、代码示例 2、List&#xff08;列表&#xff09;2.1、代码示例 3、Set&#xff08;集合&#xff09;3.1、代码示例 4、Hash&#xff08;散列&#xff09;4.1、代码示例 5…

计算机的错误计算(一百六十六)

摘要 探讨 MATLAB 关于算式 的计算误差。 例1. 已知 计算 直接贴图吧&#xff1a; 然而&#xff0c;16位的正确结果为 -0.9765626220703239e-21&#xff08;ISRealsoft 提供&#xff09;。这样&#xff0c;MATLAB输出的有效数字的错误率为 (16-2)/16 87.5% . 注&…

大模型时代的具身智能系列专题(十五)

Shubhangi Sinha团队 Shubhangi Sinha是康奈尔大学计算机科学系助理教授。在加入康奈尔大学之前&#xff0c;Tapo 是华盛顿大学计算机科学与工程专业的 NIH Ruth L. Kirschstein NRSA 博士后研究员。他在佐治亚理工学院获得了机器人学博士学位。他之前还曾在迪士尼研究中心工作…

【软件入门】Git快速入门

Git快速入门 文章目录 Git快速入门0.前言1.安装和配置2.新建版本库2.1.本地创建2.2.云端下载 3.版本管理3.1.添加和提交文件3.2.回退版本3.2.1.soft模式3.2.2.mixed模式3.2.3.hard模式3.2.4.使用场景 3.3.查看版本差异3.4.忽略文件 4.云端配置4.1.Github4.1.1.SSH配置4.1.2.关联…

鱼眼相机模型-MEI

参考文献&#xff1a; Single View Point Omnidirectional Camera Calibration from Planar Grids 1. 相机模型如下&#xff1a; // 相机坐标系下的点投影到畸变图像// 输入&#xff1a;相机坐标系点坐标cam 输出&#xff1a; 畸变图像素点坐标disPtvoid FisheyeCamAdapter::…

C++网络编程之多播

概述 在移动互联网时代&#xff0c;随着多媒体应用的日益普及&#xff0c;如何高效地将数据传输给多个接收者成为了网络通信领域的一个重要课题。多播&#xff08;英文为Multicast&#xff09;作为一种高效的网络通信方式&#xff0c;可以将数据同时发送到多个接收者&#xff0…

计算机毕业设计Python音乐推荐系统 机器学习 深度学习 音乐可视化 音乐爬虫 知识图谱 混合神经网络推荐算法 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

直播技术-Android基础框架

目录 &#xff08;一&#xff09;直播间架构 &#xff08;二&#xff09;核心任务调度机制 &#xff08;1&#xff09;复制从滑动直播间加载流程 &#xff08;2&#xff09;核心任务调度机制-代码设计 &#xff08;3&#xff09;核心任务调度机制-接入指南 (三&#xff0…

『 Linux 』数据链路层 - MAC帧/以太网帧

文章目录 MAC帧/以太网帧局域网的通信原理 MAC帧/以太网帧 MAC帧也叫做以太网帧,通常情况下MAC帧也是一个更广义的语术,用来描述数据链路层,即OSI模型的第二层的一种数据帧格式,这种格式包括其他如WI-FI,令牌环,帧中继等数据链路层所使用的数据帧; 以太网帧是具体使用的一种MAC…

LightRAG开源了…结合本地ollama实现股票数据接口Akshare智能问答

LightRAG是由香港大学研究团队推出的一种检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;系统。该系统通过整合图结构索引和双层检索机制&#xff0c;显著提升了大型语言模型在信息检索中的准确性和效率。LightRAG 不仅能够捕捉实体间的复杂依赖关系…

LabVIEW引用类型转换问题

一、问题描述 在LabVIEW中&#xff0c;refnum&#xff08;引用编号&#xff09;用于引用各种资源&#xff0c;如文件、队列、控件等。这些引用是与具体类型相关的&#xff0c;通常情况下&#xff0c;LabVIEW会根据引用的类型自动进行处理。然而&#xff0c;当不同类型的引用需…

Redis五大基本类型——Set集合命令详解(命令用法详解+思维导图详解)

目录 一、Set集合类型介绍 二、常见命令 1、SADD 2、SMEMBERS 3、SISMEMBER 4、SCARD 5、SRANDMEMBER 6、SPOP 7、SMOVE 8、SREM ​编辑 9、集合间操作 &#xff08;1&#xff09;SINTER &#xff08;2&#xff09;SINTERSTORE &#xff08;3&#xff09;SUNION…

HTMLCSS:彩色灵动气泡效果

效果演示 这段代码是一个HTML文档&#xff0c;包含了内联的CSS样式&#xff0c;用于创建一个具有动画效果的网页背景&#xff0c;其中包含多个彩色浮动的气泡元素。 HTML <div class"container"><div class"bubble"><span></spa…