Linux信号上

news2024/11/20 1:43:29

信号

概念

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

  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);      // 将信号集全部置1
        int 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))) // 32
        typedef 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.coloradmin.cn/o/1954972.html

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

相关文章

Adobe Acrobat Pro DC for Mac:PDF处理软件

Adobe Acrobat Pro DC for Mac是一款专为Mac用户设计的PDF处理软件&#xff0c;它凭借出色的功能和卓越的性能&#xff0c;成为了处理PDF文件的理想选择。 首先&#xff0c;Acrobat Pro DC for Mac支持全方位的PDF编辑。用户可以对PDF文档进行文本编辑、图像处理、表格制作等操…

【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能

审核看清楚了 &#xff01; 这是以太坊测试网络&#xff01;用于学习的测试网络&#xff01;&#xff01;&#xff01; 有关web3 和区块链的内容为什么要给我审核不通过&#xff1f; 别人凭什么可以发&#xff01; 目标成果&#xff1a; 实现功能分析&#xff1a; 显示账户信…

CORS-跨域资源共享

CORS-跨域资源共享 什么是CORS &#xff1f; 在前后端分离的项目中&#xff0c;我们往往会遇到跨域问题。 跨域问题只会出现在浏览器发起AJAX&#xff08;XMLHttpRequest、Fetch&#xff09;请求的时候&#xff0c;因为浏览器限制了AJAX只能从同一个源请求资源&#xff0c;除…

DeadSec CTF 2024 Misc Writeup

文章目录 MiscWelcomeMic checkflag_injectionGoLPartyMAN in the middleForgotten Password CryptoFlag killer 好久没做这么爽了噜 DK盾云服务器&#xff1a; https://www.dkdun.cn/ 最近活动是香港的1-1-3 9.9/月 Misc Welcome 进discord群签到即可 Mic check 就是他说…

echarts所遇到的问题,个人记录

TreeMap 矩形树图&#xff0c;label设置富文本之后&#xff0c;无法垂直居中 font-size 支持rem&#xff0c;其余不支持 font-size 支持 rem&#xff0c;但是其余的属性如height&#xff0c;width等不支持 echarts-for-react 绑定事件&#xff0c;会覆盖实例上绑定的 当给cha…

通过服务端注入的广告被拦截 YouTube现在可能会出现黑屏静音视频段

为避免用户使用广告拦截程序直接拦截 YouTube 平台的所有广告&#xff0c;这段时间谷歌正在采取各种措施与社区进行技术对抗&#xff0c;即谷歌不停地开发新的广告检测方式阻止用户使用广告拦截程序&#xff0c;广告拦截程序则不停地开发应对方法用来继续屏蔽广告和各种提示。 …

uni-app全局文件与常用API

文章目录 rpx响应式单位import导入css样式及scss变量用法与static目录import导入css样式uni.scss变量用法 pages.json页面路由globalStyle的属性pages设置页面路径及窗口表现tabBar设置底部菜单选项及iconfont图标 vite.config中安装插件unplugin-auto-import自动导入vue和unia…

AJAX(2)——URL

URL 什么是URL&#xff1f; 定义&#xff1a;统一资源定位符&#xff0c;缩写&#xff1a;URL&#xff0c;或称统一资源定位器、定位地址&#xff0c;URL地址,俗称网页地址&#xff0c;简称网址&#xff0c;是因特网上标准的资源的地址。 概念&#xff1a;URL就是统一资源定…

Linux下C++动态链接库的生成以及使用

目录 一.前言二.生成动态链接库三.使用动态链接库 一.前言 这篇文章简单讨论一下Linux下如何使用gcc/g生成和使用C动态链接库&#xff08;.so文件&#xff09;。 二.生成动态链接库 先看下目录结构 然后看下代码 //demo.h#ifndef DEMO_H #define DEMO_H#include<string&…

【C++】C++应用案例-检验幻方

“幻方”是数学上一个有趣的问题&#xff0c;它让一组不同的数字构成一个方阵&#xff0c;并且每行、每列、每个对角线的所有数之和相等。比如最简单的三阶幻方&#xff0c;就是把1~9的数字填到九宫格里&#xff0c;要求横看、竖看、斜着看和都是15。 口诀&#xff1a;二四为肩…

Pip换源实战指南:加速你的Python开发

1. Pip换源的重要性 在使用Python进行软件开发或数据分析时&#xff0c;pip 是Python的包管理工具&#xff0c;用于安装和管理第三方库。然而&#xff0c;由于网络环境的差异&#xff0c;特别是在某些国家&#xff0c;访问默认的PyPI&#xff08;Python Package Index&#xff…

debain12中安装mysql8

本文安装使用的官方deb&#xff0c;最新的官方安装包地址&#xff1a;https://repo.mysql.com/mysql-apt-config_0.8.29-1_all.deb 前期准备&#xff1a; 1.安装了debain12.6的虚拟机&#xff0c;我是用的virtualBox安装的12.6 Edu的镜像&#xff1b; 开始安装&#xff1a; …

微服务的入门

带着问题进行学习&#xff1a; 1. 对服务进行拆分后&#xff0c;物理上是隔离的&#xff0c;数据上也是隔离的&#xff0c;如何进行不同服务之间进行访问呢&#xff1f; 2.前端是怎么样向后端发送请求的&#xff1f; 通过http请求&#xff0c;通过url&#xff0c;请求的…

最新版Golang pprof使用(引入、抓取、分析,图文结合)

最新版Golang pprof使用 &#x1f525;具体实践: Go调试神器pprof使用教程Golang线上内存爆掉问题排查&#xff08;pprof&#xff09; Github地址:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-demo/go-pprof 引入pprof:import _ “net/http/pprof” …

python 查询机器python、gpu、安装包等环境版本信息

checkenv.py """Check environment configurations and dependency versions."""import importlib import os import resource import subprocess import sys from collections import OrderedDict, defaultdictimport torch# 查询自己想要的包…

【开源】一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。

基于 LLM 大语言模型的知识库问答系统 基于大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的知识库问答系统是一种利用先进的自然语言处理技术来理解用户查询并从知识库中检索出准确答案的系统。这里的LLM指的是能够处理和理解大量文本数据的人工智能…

【Go - 如何查看类型,运行前/运行时】

方式1 - 运行时查看 在Go中&#xff0c;你可以使用reflect.TypeOf()函数来获取变量的类型。这需要导入reflect包。以下是个示例&#xff0c;在运行时打印变量的类型&#xff1a; package mainimport ("context""fmt""reflect""go.mongodb…

精通推荐算法13:图神经网络之GraphSAGE

1 引言 近年来&#xff0c;图神经网络&#xff08;Graph Neural Networks&#xff0c;GNN&#xff09;在NLP、风控和推荐系统等领域的研究十分火热&#xff0c;其对推荐系统、生物医药、社交网络和知识图谱等非结构化数据有十分优秀的处理能力。基于图神经网络的Embedding表征…

用户登录安全是如何保证的?如何保证用户账号、密码安全?

1.HTTP协议直接传输密码&#xff08;无加密&#xff09; 前端 直接发送HTTP请求&#xff08;无加密&#xff09;&#xff0c;攻击者可直接捕获网络包&#xff0c;看到下面的明文信息 因此&#xff0c;使用HTTP协议传输会直接暴露用户敏感信息。 2.HTTPS协议直接传输密码&…

windows环境 python + opencv 加载 onnx 人脸检测模型识别人脸测试

参考博客&#xff1a; 1. OpenCV-Python 4.5.4 人脸识别应用&#xff1a;https://blog.csdn.net/qq_36563273/article/details/121510440( 代码就是在此博客代码基础上改的&#xff0c;主要添加了人脸画框的逻辑 ) 1. windows环境&#xff1a;win11 2. 安装 miniconda2-4.7.1…