Linux入门之进程信号|信号产生的方式

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

文章目录

一、信号入门

1.linux信号的基本概念

2.使用kill -l 命令可以查看系统定义的信号列表

3.信号处理常见方式

二、产生信号

1.通过终端按键产生信号

2.通过调用系统函数向进程发信号

3.由软条件产生信号

4.硬件异常产生信号

    1. /0异常

    2.模拟野指针


Linux入门之进程信号|信号产生的方式,linux,linux,服务器,后端,vscode,c++


一、信号入门

1.linux信号的基本概念

  • 信号是进程之间事件异步通知的一种方式,属于软中断。
  • 如:用户输入命令,在shell下启动一个前台进程。用户按下ctrl+c,这个键盘输入产生一个硬件终端,被os获取,解释为信号,发送给目标前台进程,前台进程因为收到信号,进而引起进程退出。
  • 前台进程:一般是bash,或者自己设置的进程,ctrl+c 可以杀掉前台进程
  • ./pro & 后台进程,无法使用ctrl+c ,只能使用kill-9
  • shell可以同时运行一个前台进程和任意多个后台进程

2.使用kill -l 命令可以查看系统定义的信号列表

Linux入门之进程信号|信号产生的方式,linux,linux,服务器,后端,vscode,c++

  • 每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到
  • 编号34以上的信号都是实时信号

3.信号处理常见方式

  1. 忽略此信号
  2. 执行该信号的默认处理动作
  3. 提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(catch)一个信号

二、产生信号

1.通过终端按键产生信号

SIGINT默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且设置core dump

core dump:

  • 当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部 保存到磁盘上,文件名通常是core,这叫做Core Dump。进程异常终止通常是因为有Bug,比如非法内存访问导致段错误, 事后可以用调试器检查core文件以查清错误原因,这叫做Post-mortem Debug(事后调试)。
  • 一个进程允许产生多大的core文件取决于进程的Resource Limit(这个信息保存 在PCB中)。默认是不允许产生core文件的, 因为core文件中可能包含用户密码等敏感信息,不安全。在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。 首先用ulimit命令改变Shell进程的Resource Limit,允许core文件最大为1024K: $ ulimit -c 1024

如,按下ctrl+c 产生kill进程的信号。 其具体过程是:键盘被按下,触发硬件终端控制器产生脉冲,cpu的某个引脚接收响应,寄存器x号设置为高点评,此时找到cpu中的终端向量表中下标为x的函数指针,函数指针中有对应的方法。os管理软硬件资源,此时知道要从键盘中读取响应的数据到内存,将键盘按下的组合键转化为信号,找到前台进程,将信号写入这个进程pcb的位图结构。

2.通过调用系统函数向进程发信号

  1. kill命令 是调用kill函数实现的,kill函数可以给一个指定的进程发送指定的信号
#include<signal.h>
int kill(pid_t pid,int signo);
//发送成功返回0,失败返回-1

     2.rasie函数,可以给当前进程发送指定的信号(自己给自己发信号)

int raise(int signo)
//成功返回0,失败返回-1

    3.abort函数 使当前进程接收到信号异常终止,就想exit一样

void abort(void);
abort函数总是回成功的,所以没有返回值

3.由软条件产生信号

#include<unistd.h>

usigned int alarm(unsigned int seconds);
//调用alarm函数可以设定一个闹钟,告诉os在seconds秒之后向进程发送SIGALRM信号,该信号的默认处理动作是终止当前进程

//该函数的返回值是0,或者是以前设定闹钟的时间还剩余的秒数
如:设定一个30s的闹钟,在20s时由于别的进程让alarm响了,此时函数返回10s

4.硬件异常产生信号

    1. /0异常

硬件异常被硬件以某种方式检测到并通知os,然后内核向当前进程发送适当的信号。例如,当前执行了/0的指令,cpu的状态寄存器溢出,os对软硬件资源管理,发现异常,os向进程中写入8号信号。

    2.模拟野指针


void handler(int sig)
{
    printf("catch a sig: %d\n",sig);
}


int main()
{
    signal(SIGSEVE,handler);
    int * p = nullptr;
    *p = 100;
}

运行上述代码,发现有segmentation falut段错误。其具体原因是:在执行进程是,通过页表kv转换到物理内存,如果kv有映射,要看mmu权限,有权限,写入,无权限mmu报错,os找到进程pcb,向进程发送11号信号。如果kv无映射,mmu映射报错。


  文章来源地址https://www.toymoban.com/news/detail-696573.html

到了这里,关于Linux入门之进程信号|信号产生的方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Linux】第八讲:Linux进程信号详解(一)_ 认识信号 | 产生信号

    「前言」文章是关于Linux进程信号方面的知识,本文的内容是Linux进程信号第一讲,讲解会比较细,下面开始! 「归属专栏」Linux系统编程 「主页链接」个人主页 「笔者」枫叶先生(fy)  「枫叶先生有点文青病」「每篇一句」  人生天地间,忽如远行客。 ——《乐府·青青陵上

    2023年04月25日
    浏览(49)
  • 【Linux】进程信号概念 | 核心转储 | 信号的产生

    进程信号重点: 1.掌握Linux信号的基本概念 2.掌握信号产生的一般方式 3.理解信号递达和阻塞的概念,原理。 4.掌握信号捕捉的一般方式。 5.重新了解可重入函数的概念。 6.了解竞态条件的情景和处理方式 7.了解SIGCHLD信号, 重新编写信号处理函数的一般处理机制 学习的顺序

    2024年02月22日
    浏览(48)
  • 【Linux】进程信号 --- 信号的产生 保存 捕捉递达

    被爱情困住的是傻子 1. 关于信号这个话题我们其实并不陌生,早在以前的时候,我们想要杀死某个后台进程的时候,无法通过ctrl+c热键终止进程时,我们就会通过kill -9的命令来杀死信号。 查看信号也比较简单,通过kill -l命令就可以查看信号的种类,虽然最大的信号编号是

    2023年04月23日
    浏览(38)
  • 【Linux】进程信号 -- 信号产生 | 系统调用、硬件、软件的信号发送

    kill -l 是一个在 Linux 和 Unix 系统中使用的命令,用于列出可用的信号列表。 在Linux和Unix系统中,进程可以通过发送信号来与其他进程或操作系统交互。kill 命令可以向指定的进程发送一个特定的信号,以便对其进行控制,例如终止进程或重新启动进程等。 kill -l 命令会列出可

    2024年02月16日
    浏览(83)
  • 【Linux】详解信号产生的方式

    在命令行中通过 kill -数字 pid 指令可以给指定进程发送指定信号。这里说明一下几个常见的信号: SIGINT(2号信号):中断信号,通常由用户按下Ctrl+C产生,用于通知进程终止。 SIGQUIT(3号信号): 终止进程并产生core文件,用于后续分析程序崩溃时的状态和数据。 SIGKILL(

    2024年04月28日
    浏览(40)
  • 【探索Linux】—— 强大的命令行工具 P.16(进程信号 —— 信号产生 | 信号发送 | 核心转储)

    在现代社会中,信号无处不在。我们的生活充满了各种各样的信号,它们指引着我们前进的方向,使我们能够了解周围环境的变化。正如在计算机编程中一样,Linux进程信号也是一种重要的信号,它们扮演着相似的角色。 想象一下,在繁忙的城市街道上行驶,交通信号灯是我

    2024年02月05日
    浏览(54)
  • 【Linux】进程信号(完整版) --- 信号产生 信号保存 信号捕捉 可重入函数 volatile SIGCHLD信号等

    🍎 作者: 阿润菜菜 📖 专栏: Linux系统编程 我们想要杀死某个后台进程的时候,无法通过ctrl+c热键终止进程时,我们就会通过kill -9的命令来杀死信号。 查看信号也比较简单,通过 kill -l 命令就可以查看所有信号的种类,虽然最大的信号编号是64,但实际上所有信号只有6

    2024年02月04日
    浏览(50)
  • 【Linux从入门到精通】信号(初识信号 & 信号的产生)

         本篇文章会对Linux下的信号进行详细解释。主要内容是 什么是信号、信号的产生、核心转储等问题 。希望本篇文章会对你有所帮助。 文章目录 引入 一、初识信号 1、1 生活中的信号 1、2 Linux 下的信号 1、3 信号+进程所得的初识结论 二、信号的产生 2、1 用户通过终端输

    2024年02月09日
    浏览(46)
  • 【Linux】进程信号篇Ⅰ:信号的产生(signal、kill、raise、abort、alarm)、信号的保存(core dump)

    kill -l 可以查看所有信号: 其中,前面的数字就是信号,后面的大写英文就是信号名称,实际就是宏。 我们需要关注的是 1~31 号普通信号,关注他们有没有产生(可以用 0 或者 1 表示)。 所以,进程的 pcb 中,需要对产生的信号先用 位图 保存起来,再按照一定的顺序去处理

    2024年01月25日
    浏览(39)
  • 『Linux从入门到精通』第 ㉖ 期 - 信号概念 & 信号的产生

    🌸作者简介: 花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。 🌸 专栏简介:本文收录于 Linux从入门到精通 ,本专栏主要内容为本专栏主要内容为Linux的系统性学习,专为小白打造的文章专栏。

    2024年03月15日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包