Linux信号上

信号

概念

信号是由于进程产生,但是由内核调度传递给另一个进程:

  1. 产生信号
    • 按键产生信号:
      • Ctr+c --> 2)SIGINT(终止/中断)
      • Ctr+z --> 20)SIGTSTOP(终端暂停)
      • Ctr+\ --> 3)SIGQUIT(退出)
    • 系统调用产生: kill(2), raise, abort
    • 软件条件产生: 如定时器alarm
    • 硬件异常产生:
      • 如非法访问内存(段错误): 11)SIGSEV(段错误)
      • 除0: 8)SIGFPE
    • 命令产生:kill(1)
  2. 递达:产生的信号递达到了接受信号进程
  3. 未决:
    • 介于产生信号和递达之间的状态,主要由于阻塞信号集导致。
    • 我们可以直接操作的是堵塞信号集,来影响未决信号集。
  4. 信号的处理方式
    • 默认:但是每个信号的默认动作可能不一致

      • Term: 终止进程
      • Ign : 忽略信号(默认即时对该种信号忽略操作)
      • Core: 终止进程,生成Core文件(查验进程死亡原因,用于gbd调试)
      • Stop: 停止(暂停)进程
      • Cnt : 继续运行进程
      • 9)SIGKILL、19)SIGSTOP 不允许忽略和捕捉,只能执行默认动作。
    • 忽略:对于该信号的处理动作就是忽略

    • 捕捉:调用用户处理函数

signal相关函数
1.kill
    #include <sys/types.h>#include <signal.h>int kill(pid_t pid, int sig);
  • 第一个参数:
    • pid > 0: 发送信号给指定的进程
    • pid = 0: 发送信号给与调用进程同一组的的所有进程,而且发送进程有权向他们发送信号
    • pid < 0: 将信号发送对应进程组ID=|pid|,而且发送进程有权向他们发送信号
    • pid =-1: 发送给这样的进程:而且发送进程有权向他们发送信号
2.raise/abort
    // raise#include <signal.h>int raise(int sig);// abort#include <stdlib.h>void abort(void);
  • raise : 自己给自己发信号
  • abort : 自己给自己发终止信号
3.alarm
    #include <unistd.h>unsigned int alarm(unsigned int seconds);
  • 设置定时器,在指定seconds之后,不管进程处于什么状态,时间一到就发送信号。内核给当前进程发送是14)SIGALRM信号,进程收到该信号,默认动作是终止进程。
  • seconds == 0时,即取消定时器
  • 第一次设置定时器返回值0。后面再设置定时器时,会覆盖前面的定时器,重新计数,此时返回值是前面定时器剩余的秒数。
  • 每个进程有且只有一个定时器。
4.setitimer
    #include <sys/time.h>int getitimer(int which, struct itimerval *curr_value);int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);struct itimerval {struct timeval it_interval; /* Interval for periodic timer */struct timeval it_value;    /* Time until next expiration */};struct timeval {time_t      tv_sec;         /* seconds */suseconds_t tv_usec;        /* microseconds */};

setitimer 相比较 alarm 提供了更加精确的定时信号控制,前者是微妙级,后者是秒级。

  • which
    • ITIMER_REAL  : 等同于 alarm,自然定时,即和进行状态无关,时间到就发送SIGALRM
    • ITIMER_VIRTUAL: 计算进程占用cpu时间,发送信号SIGVTALRM
    • ITIMER_PROF   : 计算进程cpu调用及执行系统调用时间,发送信号SIGPROF
  • new_value/old_value
    • 前者是需要设置的时间,后者是返回的时间。
    • setitimer 是一个周期定时,new_value设置的本次和下次定时时间。当下次定时时间为0,就仅仅定时一次。

5. singal
    #include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);

通过signal函数可以自定义信号处理函数来应对信号。信号是由内核检测到,而函数signal是将信号和信号处理函数联系起来。

  • 第一个参数: signal是接受到的信号,传递给信号处理函数。
  • 第二个参数: 是信号处理函数,其格式:typedef void (*sighandler_t)(int);即返回类型是void,参数是int类型的函数,同时这个函数的接受值就是产生的信号。
6. 信号集

内核通过读取未决信号集来判断信号是否应该被处理。信号屏蔽字mask可以影响未决信号集,而信号屏蔽字需要通过数据类型sigset_t创建的对象set来设置mask,来达到屏蔽信号的目的,即影响未决信号集来决定信号是否将被处理。他们之间的关系如图:

  • mask操作函数
        #include <signal.h>int sigemptyset(sigset_t *set);     // 将信号集合清空int sigfillset(sigset_t *set);      // 将信号集全部置1int sigaddset(sigset_t *set, int signum);   // 将某个信号加入信号集int sigdelset(sigset_t *set, int signum);   // 将某个信号清出信号集int sigismember(const sigset_t *set, int signum);   // 判断某个信号是否在信号集#define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int))) // 32typedef struct {unsigned long int __val[_SIGSET_NWORDS];} __sigset_t;typedef __sigset_t sigset_t; 
    
    sigset_t是一个位图,通过上述函数来操作这个位图。上面的函数成功返回0,失败返回-1。
  • sigprocmask
    用来获取或者改变调用进程的信号mask。也可屏蔽信号、解决屏蔽。
        #include <signal.h>int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
    
    • 第一个参数:决定了函数调用的行为
      • SIG_BLOCK  :  进程的屏蔽信号集是这个set和原来的屏蔽信号笔的并(union)。
      • SIG_UNBLOCK: 将set中的信号从当前信号集合中移除出去。
      • SIG_SETMASK: 直接将set覆盖当前信号集
    • 第二个参数:set即上面的sigset_t格式,是本次函数给阻塞信号的设定值。
    • 第三个参数:返回的当前的信号屏蔽集合。
  • sigpending
        #include <signal.h>int sigpending(sigset_t *set);
    
    将调用进程的未决信号集存储在set中传出。
7. sigaction
    #include <signal.h>int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);struct sigaction {void     (*sa_handler)(int);        void     (*sa_sigaction)(int, siginfo_t *, void *);sigset_t   sa_mask;int        sa_flags;void     (*sa_restorer)(void);};
  • struct sigaction
    • sa_handler: 用来指定捕捉到信号时候的行为。SIG_DFLSIG_IGN、信号处理函数。
    • sa_sigaction:
      sa_flags = SA_SIGINFO时,sa_sigaction指定信号处理函数(之前是sa_handler指定)。
    • sa_mask:指定的是在处理信号的过程中需要屏蔽的信号,即不捕捉该该信号,那么就会执行默认动作。而且触发该处理函数的信号再来时候会丢弃,即 多次信号只执行一次 ,除非sa_flags = SA_NODEFER
    • sa_flags:指定的是用于修改信号行为的标志位,默认是0,即在信号处理函数执行期间自动屏蔽本信号。这个函数的操作还是要依赖 mask的操作函数。
    • sa_restorer:不要使用。
  • 返回值:成功是0,失败是-1.

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

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

相关文章

从与原始的Transformer architecture比较来理解GPT

从与原始的Transformer architecture比较来理解GPT flyfish 一、Transformer architecture 先说名词 不同的文献和资料中有不同的名字&#xff0c;其实是一样的意思 1 编码器-解码器多头注意力机制&#xff08;Encoder-Decoder Multi-Head Attention Mechanism&#xff09; …

爬虫-实战爬取虎扑ACG帖子

要求如下: 爬取虎扑步行街 ACG 版面的数据,要求使用多线程来并发爬取。范围是第一页的所有帖子,每个帖子包含标题、主题内容和第一页的所有回复内容。最后打印出爬到的所有帖子的标题。 网址是:ACG圈 - 虎扑社区。 针对上面的要求,我们进行分析: 首先是要使用多线程范…

韩顺平0基础学java——第39天

p820-841 jdbc和连接池 1.JDBC为访问不同的数据库提供了统一的接口&#xff0c;为使用者屏蔽了细节问题。 2.Java程序员使用JDBC&#xff0c;可以连接任何提供了JDBC驱动程序的数据库系统&#xff0c;从而完成对数据库的各种操作。 3.jdbc原理图 JDBC带来的好处 2.JDBC带来的…

结构体笔记

结构体 C语言中的数据类型&#xff1a; 基本数据类型&#xff1a;char/int/short/double/float/long 构造数据类型&#xff1a;数组&#xff0c;指针&#xff0c;结构体&#xff0c;共用体&#xff0c;枚举 概念&#xff1a; 结构体是用户自定义的一种数据类型&#xff0c…

《Milvus Cloud向量数据库指南》——ChatGLM:从GLM-130B到GLM-4

ChatGLM:从GLM-130B到GLM-4的跨越:智谱AI在通用人工智能领域的深度探索与实践 在人工智能的浩瀚星空中,智谱AI如同一颗璀璨的新星,以其独特的技术视角和坚定的创新步伐,在通用人工智能(AGI)的征途上留下了深刻的足迹。技术生态总监贾伟在近期的一次分享中,不仅为我们描…

20.rabbitmq插件实现延迟队列

问题 前面谈到基于死信的延迟队列&#xff0c;存在的问题&#xff1a;如果第一个消息延时时间很长&#xff0c;而第二个消息延时时间很短&#xff0c;第二个消息并不会优先得到执行。 下载插件 地址&#xff1a;https://github.com/rabbitmq/rabbitmq-delayed-message-excha…

49.TFT_LCD液晶屏驱动设计与验证(2)

&#xff08;1&#xff09;Visio视图&#xff1a; &#xff08;2&#xff09;控制模块Verilog代码&#xff1a; module tft_ctrl(input clk_33M ,input reset_n ,input [23:0] data_in ,output [9:0] hang…

PLSQL Developer工具查询数据,报错(动态性能表不可访问)

解决的问题&#xff1a; 解决方案&#xff1a; 在配置-首选项-选项&#xff0c;取消勾选“自动统计”&#xff0c;保存之后即可查询数据

WSL快速入门

1. WSL介绍 WSL文档地址&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl WSL&#xff1a;全称 Windows Subsystem for Linux&#xff0c;即windows上的Linux子系统&#xff08;虚拟机工具&#xff09;。是Win10推出的全新特性&#xff0c;可以更轻量地在Windows系统…

【网络安全】子域名模糊测试实现RCE

未经许可&#xff0c;不得转载。 文章目录 正文总结 正文 在之前测试一个私人项目时&#xff0c;我报告了admin.Target.com上的Auth Bypass漏洞&#xff0c;这将导致SQLI&RCE &#xff0c;该漏洞在报告后仅一天就被修复。 现在重拾该应用程序&#xff0c;对子域进行模糊测…

RAG技术之Router

Router有什么用&#xff1f; 在RAG应用中&#xff0c;Router可以帮助我们基于用户的查询意图来决定使用何种数据类型或数据源&#xff0c;比如是否需要进行语义检索、是否需要进行text2sql查询&#xff0c;是否需要用function call来进行API调用。 Router也可以根据用户的查询…

麦田物语第十五天

系列文章目录 麦田物语第十五天 文章目录 系列文章目录一、构建游戏的时间系统二、时间系统 UI 制作总结 一、构建游戏的时间系统 在该游戏中我们要构建年月日天时分秒等时间的概念&#xff0c;从而实现季节的更替&#xff0c;昼夜的更替等&#xff08;不同的季节可以播种不同…

qt总结--翻金币案例

完成了一个小项目的在qt5.15.2环境下的运行,并使用NSIS editNSIS打包完成.有待改进之处:增加计时功能,随机且能通关功能,过关后选择下一关功能.打包后仅仅有安装包有图标 安装后应用图标并未改变 在qt .pro中有待改进对qt的基本操作和帮助文档有了基本的认识.对C制作小游戏有了…

YOLO5项目目录最强解析

YOLO5项目目录解析 YOLOv5 项目目录下的文件和目录的结构&#xff0c;以下是对每个目录和文件的解释&#xff1a; 目录 &#x1f4c1; .github: 存放 GitHub 相关配置和文件&#xff0c;如 GitHub Actions 工作流文件、Issue 模板等&#xff0c;用于自动化构建和持续集成等功…

MYSQL 第五次作业

一、第五次作业 二、建立触发器 在订单表中增加订单数量后&#xff0c;商品表的商品数量同步减少对应的商品订单出数量&#xff1b;客户取消订单时恢复商品表对应商品的数量&#xff1b;当客户修改订单时&#xff0c;商品表对应商品的数量同步更新。 3、存储 DELIMITER $$ CREA…

USB 2.0 协议专栏之 USB 2.0 连接与枚举(二)

前言&#xff1a;本篇博客为手把手教学的 USB 2.0 协议栈类精品博客&#xff0c;该专栏博客侧重针对 USB 2.0 协议进行讲解。本篇博客将针对 USB 2.0 中的连接与枚举进行教学&#xff0c;USB 的枚举过程是 USB 协议中至关重要的一环&#xff0c;也是嵌入式工程师必须掌握的内容…

Python层内层外多图布局图基分析

&#x1f3af;要点 &#x1f3af;多层图和多路复用图结构模型 | &#x1f3af;图结构变换、读写图、聚类系数、可视化、同构、图基分析 | &#x1f3af;稀疏网络边数和节点数线性扩展 | &#x1f3af;耦合边的生成和惰性评估 | &#x1f3af;层内布局计算、多层网络绘图、层间…

基于深度学习网络的USB摄像头实时视频采集与水果识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 将usb摄像头对准一个播放不同水果图片的显示器&#xff0c;然后进行识别&#xff0c;识别结果如下&#xff1a; 本课题中…

Vue3--

一、pinia &#xff08;集中式状态&#xff08;数据&#xff09;管理&#xff09; 1、准备一个效果 2、存储读取数据 3、修改数据三种方式 4、storeToRefs 5、getters 当state中的数据&#xff0c;需要经过处理后在使用时&#xff0c;可以使用getters配置 6、$subscribe的使用…