linux信号机制[二]

这篇具有很好参考价值的文章主要介绍了linux信号机制[二]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

阻塞信号

信号相关概念

  • 实际执行信号的处理动作称为信号递达(Delivery)
  • 信号从产生到递达之间的状态,称为信号未决(Pending)。[收到信号但是没有处理]
  • 进程可以选择阻塞 (Block )某个信号。
  • 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作.
  • 注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。

忽略和阻塞处理的区别:

忽略代表信号已经抵达,并且处理了,处理的方式就是什么都不干。而阻塞则信号压根没有被递达。阻塞的信号如果不解除阻塞的话永远不会被递达,只有解除阻塞才可以。 

由上面的概念我们可以得出pcb内部其实由3张表

linux信号机制[二],Linux,服务器,网络,运维

对padding的修改代表是否收到了信号,以及收到了什么信号。handler 是函数指针,代表着各个信号的实现方法。  自定义信号捕捉,就是把自己的函数处理方式填到handler里面。

在信号处理的时候方法是直接调用的吗?

NO对于我们传入的参数,他会先进行强制类型转换,如果等于1,执行默认行为,等于2忽略,都不等于才会执行调用对应的方法。

block表也是一个位图结构和padding一模一样。唯一的差别是位图中的内容代表信号是否被阻塞。

一个信号被处理的过程

操作系统修改padding位图,然后查找block表看是否被阻塞,然后进入对应的handler表执行处理方法。

sigset_t

每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次,阻塞标志也是这样表示的。因此,未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集,这个类型可以表示每个信号 的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有 效”和“无效”的含义是该信号是否处于未决状态。

阻塞信号集也叫做当前进程的信号屏蔽字(Signal Mask),这里的“屏蔽”应该理解为阻塞而不是忽略

基本上语言会给我们提供.h .hpp&&语言类自定义类型,同时os也会给我们提供.h和os自定义类型。sigset_t是一格位图结构但是不允许用户自己进行处理,操作系统提供对应的位操作方法。这个类型用户可以直接使用,和默认类型没有差别。

接口:

sigpending

#include<singal.h>

sigpending(sigset_t *set)

读取当前进程的未决(padding)信号集,通过set参数传出,拿给用户。调用成功则返回0,出错则返回-1。 

 sigprocmask

#include<singal.h>

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

检查并更改阻塞信号集返回值:若成功则为0,若出错则为-1

如果oldset是非空指针,则读取进程的当前信号屏蔽字通过oldset参数传出(输出型参数)。如果set是非空指针,则 更改进程的信 号屏蔽字,参数how指示如何更改。如果oldset和set都是非空指针,则先将原来的信号 屏蔽字备份到oset里,然后 根据set和how参数更改信号屏蔽字。假设当前的信号屏蔽字为mask,下表说明了how参数的可选值:

linux信号机制[二],Linux,服务器,网络,运维

小实验:

对所有信号进行捕捉——是不是就写了一个不会异常或者被杀掉的进程?

 #include<iostream>
 #include<signal.h>
//信号捕捉
void catchsig(int sigum)
{
    cout<<"捕捉到了信号:"<<sigum<<"pid:"<<"getpid()"<<endl;
}

int main()

{

    alarm(1);
    int count =0;
    while(1)
    {
        cout<<"cout :"<<count++<<endl;
    }
}

我们运行代码会发现一个现象,所有的信号都可以被捕捉,但是9号信号不可以被捕捉自定义。这个就是为了避免这种情况发生 。

如果将2号信号block,并不断获取pending信号机,如果发送一个2号信号我们是不是就应该看到pending中有一个比特位0->1? 是的

 #include<iostream>
 #include<unistd.h>
 #include<cassert>
 #include<signal.h>
void catsig(int signal)
{
    std::cout<<signal<<"signal信号被捕捉";
}


static void showpening(sigset_t &pending)
{
    for(int sig=1;sig<31;sig++)
    {
        if(sigismember(&pending,sig))//查看是不是在进程中
        {
            std::cout<<"1"<<std::endl;

        }
        else
        {
             std::cout<<"0"<<std::endl;

        }
    }
    std::cout<<std::endl;
}

int main()
{
    //1.定义信号集对象
    sigset_t set,oset;
    sigset_t pending;
    //2.初始化信号集
    sigemptyset(&set);
    sigemptyset(&oset);
    sigemptyset(&pending);
    //3.添加要屏蔽的信号
    sigaddset(&set,2);//
    //4.设置set到操作系统内核中【默认不会对任何信号block】
    int n=sigprocmask(SIG_BLOCK,&set,&oset);
    assert(n==0);
    (void)n;
    std::cout<<"block 2号信号成功"<<std::endl;
    //5.重复打印当前进程的信号集
    while(1)
    {
        //5.1获取当前进程padding集
        sigpending(&pending);
        //5.2显示pending中没有被递达地信号
        showpening(pending);
        sleep(1);
    } 
    return 0;
}

如果对所有的进程进行block——是不是就写了一个不会异常或者被杀掉的进程?

不会,9号以及19号信号不可以被捕捉阻塞或者屏蔽。

信号捕获之后可能无法处理,合适地时候是什么时候?流程是什么

合适的时候:信号相关字段在pcb内部(内核状态)。在内核态,返回用户态地时间进行信号地检测和处理。进行系统调用,缺陷陷阱等。int 80 特殊接口 内置在系统调用中。

内存映射页表,用户级页表,每个进程都有一份,不共有,内核级进程操作系统共有一份,通用。

linux信号机制[二],Linux,服务器,网络,运维

捕捉信号

linux信号机制[二],Linux,服务器,网络,运维

信号捕捉在处理信号的时候又出现新的信号 ,os如何处理呢?block。

!!信号捕捉没有创建新的线程和进程。文章来源地址https://www.toymoban.com/news/detail-827960.html

到了这里,关于linux信号机制[二]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux服务器常见运维性能测试(1)综合跑分unixbench、superbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月04日
    浏览(75)
  • [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

    本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于docker的,想法很先进。官方还提供了视频的使用教程,本期为大家按照本专栏的基本内容进行多方面的测评。

    2024年02月07日
    浏览(89)
  • 华为云云耀云服务器L实例评测 | Linux系统宝塔运维部署H5游戏

    本章节内容,我们主要介绍华为云耀服务器L实例,从云服务的优势讲起,然后讲解华为云耀服务器L实例资源面板如何操作,如何使用宝塔运维服务,如何使用运维工具可视化安装nginx,最后部署一个自研的H5的小游戏(6岁的小朋友玩的很开心😁)。 前端的同学如果想把自己

    2024年02月07日
    浏览(56)
  • Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月02日
    浏览(52)
  • linux并发服务器 —— linux网络编程(七)

    C/S结构 - 客户机/服务器;采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互;C/S结构中,服务器 - 后台服务,客户机 - 前台功能; 优点 1. 充分发挥客户端PC处理能力,先在客户端处理再提交服务器,响应速度快; 2. 操作界面好看,满足个性化需求; 3.

    2024年02月09日
    浏览(73)
  • Linux - 进阶 NFS服务器 详解网络共享服务器 ( 预备知识)

               N  :  就是 网络 Network          F   :     就是  File  文件         S   :  system          简称为 网络文件系统                 官方   :               NFS 是一种古老的用于UNIX/LINUX主机之间进行文件共享的协议              Network  File  System 网

    2024年02月13日
    浏览(50)
  • linux服务器监控之内存、cpu、网络、磁盘

    一、服务器实时内存监控 1、Linux帮助命令 man:Linux下的函数手册命令,可以查看所有命令的使用方法 ls:  ls -al: ll: 2、实时监控命令 top:   能够实时监控系统的运行状态,并且可以按照cpu及内存等进行排序。            语法:top -hv|-bcHiOSs -d secs -n max -u|U user -p pid(s) -o file

    2024年02月09日
    浏览(63)
  • Linux系统如何查看服务器带宽及网络使用情况?

    要查看Linux服务器的带宽和网络使用情况,可以使用以下命令和工具: ifconfig命令:ifconfig命令用于显示和配置网络接口信息,包括带宽和网络使用情况。 使用以下命令查看所有网络接口的信息: 该命令将显示每个网络接口的详细信息,包括接收和发送的数据包数量以及网络

    2024年02月16日
    浏览(50)
  • Linux系统如何查看服务器带宽及网络使用情况

       操作系统: Linux    操作环境: Centos7   Linux系统中如何查看服务器带宽?本篇文章主要和大家分享一下Linux系统中查看服务器带宽的方法,有需要的朋友可以参考一下。 众多网络相关的命令可查看:【Linux】之【网络】相关的命令及解析[ethtool、nload、nethogs、iftop、

    2024年02月02日
    浏览(70)
  • Linux学习之网络编程3(高并发服务器)

    Linux网络编程我是看视频学的,Linux网络编程,看完这个视频大概网络编程的基础差不多就掌握了。这个系列是我看这个Linux网络编程视频写的笔记总结。 问题: 根据上一个笔记,我们可以写出一个简单的服务端和客户端通信,但是我们发现一个问题——服务器只能连接一个

    2024年02月01日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包