• 【Linux】信号简介与触发信号的几种方式


    相信大家或多或少都听说过信号这一概念,这篇博客将为大家讲解一些信号方面的基础知识

    目录

    信号简介

    关于信号的一些小秘密

    系统中触发信号的几种方式

    1.终端组合按键触发信号

    2.命令触发信号

    3.函数触发信号

    4.硬件异常产生信号

    5.软条件触发产生信号


    信号简介

    定义Linux操作系统中重要的消息机制
    功能主要被用于进程干预处置,大多数信号的作用是杀死或挂起进程,只有少部分的信号不是用来杀死或挂起进程
    个数64个,可通过命令 kill -l 来查看系统支持的信号

    这个时候有些同学可能就会有下面这些疑惑

    1. 要是信号只是用来杀进程的话,只设计一个信号直接干掉进程不就得了嘛?
    2. 为什么这么多信号,还大多数信号都是用来干掉或挂起进程的?

    这里我们来做一个情景假设,相信大家很容易就明白了

    比如你自信满满的写了段代码,一编译运行,操作系统把对应的这个进程干掉了,你再编译运行,又给你干掉了,然后啥错误都不给你返回,你人傻了,我靠,我这代码这么惊天地泣鬼神,就算有那么一丢丢的小瑕疵,你好歹让我知道错哪了吧

    此时,信号就起到了这个作用,当进程出现错误时,就会触发对应的信号,操作系统接收到信号时,就会去杀死该进程,同时根据接收到的信号为你返回错误原因

    总而言之,信号就类似于罪名   进程犯了什么错,就会为你返回对应的罪名

    关于信号的一些小秘密

    在前面的内容中,我们说过,可以通过命令 kill -l 来查看系统支持的信号

    在这个图片中,我们可以发现两个有趣的地方

    1. 信号31和信号34之间空缺了两个信号,这是为什么呢?
    2. 为什么信号1-31和信号34-64的格式不一致呢?

    解答1:32号信号和33号信号是隐藏信号,被保留给NPTL线程库使用,用户无法使用

    解答2:首先我们要知道,开发分为软件开发与硬件开发。1-31号信号是Unix经典信号,供软件开发使用。34-64号信号被称之为自定义信号,也被称为实时信号,是供驱动层开发使用

    系统中触发信号的几种方式

    1.终端组合按键触发信号

    相信大家或多或少地都在终端中用过CTRL+C来杀死进程,其实它的实现原理就是:当你按下该组合按键时,就会向目标进程发送2号信号—SIGINT,然后操作系统杀死该进程

    CTRL+\ 也是同理,触发的是3号信号—SIGQUIT,作用同样是杀死进程,会显示“退出(核心已转储)”字样

    CTRL+Z,触发的是20号信号—SIGTSTP来挂起终端进程到后台

    PS:19号信号—SIGSTOP和20号信号—SIGTSTP的作用都是挂起进程,二者不同的地方就在于20号信号—SIGTSTP中的第一个T,这个T是TTY的意思,由于TTY的解释过于占用篇幅,我在这里就不做过多介绍,大家只需要知道TTY和终端有关,感兴趣的同学可以去了解一下

    所以20号信号—SIGTSTP的作用就是——由终端发送TSTP信号来挂起终端进程

    19号信号—SIGSTOP的作用就是——由操作系统发送STOP信号来挂起目标进程

    2.命令触发信号

    这个大家也很常用,kill  -signo  pid  #向任意目标进程发送任意信号

    signo——信号编号

    3.函数触发信号

    有三个比较常用的函数,如下所示:

    1. kill(int pid , int signo) #向任意进程发送任意信号
    2. raise(int signo) #向自身进程发送任意信号
    3. abort(void) #向自身进程发送6号信号——SIGABRT

         PS: kill命令就是用kill函数写的,不要直接看下面的代码,大家可以尝试一下自己实现

    1. #include
    2. #include
    3. #include
    4. #include
    5. int main(int argc , char** argv)
    6. {
    7. if(argc < 3)
    8. {
    9. printf("参数输入过少,请检查!\n");
    10. exit(0);
    11. }
    12. kill(atoi(argv[2]) , atoi(argv[1]));
    13. printf("进程已杀死!\n");
    14. exit(0);
    15. }

    4.硬件异常产生信号

    常见的有以下三种情况:

    1. 段错误,进程非法访问内存,就比如只读的内存你写了,系统就会通过11号信号—SIGSEGV杀死进程
    2. 总线错误,内存访问越界,比如栈溢出问题,系统就会通过8号信号—SIGBUS杀死进程
    3. 浮点数例外,CPU违规运算,运算异常,系统就会通过7号信号—SIGFPE杀死进程

    但要注意的是,无论进程是否异常,只要接收到杀死信号就会被杀死

    5.软条件触发产生信号

    常见的有以下两种情况:

    1. 管道读端关闭,写端写管道,系统向写端发送SIGPIPE信号,杀死写进程
    2. unsigned int alarm(unsigned int seconds) , 定时到时后出发SIGALRM信号给定时进程,然后杀死该进程

    以上就是本篇博客的全部内容了,大家有什么地方没有看懂的话,可以在评论区留言给我,咱要力所能及的话就帮大家解答解答

    今天的学习记录到此结束啦,咱们下篇文章见,ByeBye!

  • 相关阅读:
    [附源码]计算机毕业设计JAVA“原创音乐爱好者”交流网站论文
    c语言输入输出及缓冲区
    day24每日一考
    狂神docker
    基于粒子群算法的无人机航迹规划-附代码
    前端包管理器的工具,npm和Yarn以及pnpm是最常用的
    java计算机毕业设计支部党建工作源程序+mysql+系统+lw文档+远程调试
    腾讯系数藏停摆一年 玩家被甩在维权路上
    Windows快速安装pandora-chatgpt
    【机器学习】李宏毅——AE自编码器(Auto-encoder)
  • 原文地址:https://blog.csdn.net/m0_53133879/article/details/133610842