首页 > 系统相关 >linux 信号概念

linux 信号概念

时间:2022-09-07 17:11:11浏览次数:75  
标签:Ctrl 处理 用户 概念 终端 信号 linux 进程

信号的概念

信号(Signal)是一种软件中断,比如Ctrl+C的退出命令实质上就是使用了信号。信号在Linux操作系统中提供了一种处理异步事件的方法,可以很好地在多个进程之间进行同步和简单的数据交互。

常见的进程信号

信号代号 信号名称 说明
1 SIGHUP 用于报告用户终端已断开连接,可能是因为网络连接中断。该信号还用于向与该会话关联的作业报告终端上控制进程的终止; 此终止有效地将会话中的所有进程与控制终端断开连接。例如将tty终端断开,即发送SIGHUP信号。
2 SIGINT 程序中止信号,用于中止前台进程。相当于输出 Ctrl+C 快捷键
8 SIGFPE 在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为 0 等其他所有的算术运算错误
9 SIGKILL 用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。一般用于强制中止进程
14 SIGALRM 时钟定时信号,计算的是实际的时间或时钟时间。alarm 函数使用该信号
15 SIGTERM 正常结束进程的信号,kill 命令的默认信号。如果进程已经发生了问题,那么这个信号是无法正常中止进程的,这时我们才会尝试 SIGKILL 信号,也就是信号 9
18 SIGCONT 该信号可以让暂停的进程恢复执行。本信号不能被阻断
19 SIGSTOP 该信号可以暂停前台进程,相当于输入 Ctrl+Z 快捷键。本信号不能被阻断

信号的产生

Linux中信号可以由以下几种方式产生:

  • 当用于按下某些终端按键之后引发终端产生的信号,例如在程序运行中按下“Ctrl + \”(ctrl c , ctrl z)组合键将终止程序的运行。
  • 硬件产生的一个异常信号,例如除数为0,无效的内存引用等,这种异常信号通常会由硬件检测得到并将其通知Linux内核,然后内核为该条件发生时正在运行的进行产生适当的信号。
  • 进程调用系统调用kill函数可以给一个进程或者进程组发送一个信号,需要注意的是此时发送和接收信号的进行/进程组的所有者必须相同
  • 用户也可以调用kill命令将信号发送给其它进程
  • 当检测到某种软件条件已经发生,并应将其通知有关进程的时候也会产生一个信号,例如SIGURG信号就是在接收到一个通过网络传送的外部数据时产生的。

信号的处理方式

Linux的每一个信号都有一个缺省的动作,典型的缺省动作是终止进程,当一个信号到来的时候收到这个信号的进程会根据信号的具体情况提供以下三种不同的处理方式:

  • 类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。
  • 忽略某个信号,对该信号不做任何处理,就像从未发生过一样。
  • 对该信号的处理保留系统的默认值,这种缺省操作大多数是使得进程终止。进程通过系统调用signal函数来指定进程对某个信号的处理行为。

信号的执行过程

一个典型的执行过程是使用“Ctrl + C”组合键来中断一个车进程的运行,对其操作部分说明如下,需要注意的是只有在前台运行的程序才能接收到“Ctrl + C"组合键的输入:

01)用户输入命令,在Shell下启动一个前台进程。

02)用户按下“Ctrl + C”,这个键盘输入产生一个硬件中断。

03)如果处理器当前正在执行这个进程的代码,则该进程的用户空间代码暂停执行,CPU从用户态切换到内核台处理硬件中断。

04)终端驱动程序将“Ctrl + C“解释成一个SIGINT信号,记在该进程的PCB中(也可以说发送了一个SIGINT信号给该进程)。

05) 当某个时刻要从内核返回到该进程的用户空间代码继续执行之前,首先处理PCB中记录的信号,发现有一个SIGINT信号待处理,而这个信号的默认处理动作是终止进程,所以直接终止进程,而不再返回它的用户空间代码。

标签:Ctrl,处理,用户,概念,终端,信号,linux,进程
From: https://www.cnblogs.com/zed99/p/16666525.html

相关文章

  • Linux系统配置(防火墙)
    前言linux系统服务器如果作为网关服务器或网络服务器来使用时,配置规划防火墙能够很好的为服务器提供安全保障,Linux系统的RHEL7系列之前默认是通过iptables管理防火墙,......
  • Linux 下 tar 打包命令详细教程
    转:Linux下tar打包命令详细教程 1.打包:选项“-cvf”一般是习惯用法,记住打包时需要指定打包之后的文件名,而且要用“.tar”作为扩展名。打包目录也是如此:......
  • Qt 信号槽连接不成功问题原因汇总
    1.拥有信号槽的类,必须继承QObject,声明Q_OBJECT宏。Qt帮助手册里搜索 “Signals&Slots”,可以看到以下说明:想要使用信号槽,必须继承QObject,必须加Q_OBJECT宏。2.信号......
  • LFS(Linux From Scratch)构建过程全记录(三):准备并下载所需的软件包
    写在前面本文将记录构建LFS的过程中,下载软件包的全过程 准备下载的地址我们需要创建一个文件夹,地址为$LFS/sources,用于保存对应的源码输入的指令如下:sudomkdir-v......
  • Linux 配置 jdk 环境变量
    本文是为了自己学习记录的,有参考各路大神在安装之前,查看当前Linux系统是否已经安装java,输入rpm-qa|grepjava卸载两个openJDK输入rpm-e--nodeps要卸载的软件......
  • linux环境配置 (redis、jdk、nginx、mysql)
    linux环境配置环境准备服务器:腾讯云服务器操作系统:centos8.0终端控制器:finalshell3.9.34redis7.0.4jdk1.8.0nginx-1.21.3mysql8.0.30redis安装创建或选......
  • Linux系统启动流程
    开机启动流程图1.开机自检 电脑通电之后,首先加载BIOS(basicinputoutputsystem,基本输入输出系统)。而BIOS程序首先检查计算机能否满足运行的基本条件,这个叫做“硬件自......
  • 在Linux服务器上装个kali
     在Linux服务器上装个kali 微信公众号:小惜渗透,欢迎大佬一起交流进步  0x01  前几天练习的时候突然想用beef,而我们在本地搭建beef还需要内网映射,所以就......
  • LINUX系统中查询Oracle数据库的归档日志目录
    注:查询Linux系统中Oracle数据库的归档日志方法,不同的安装目录使用不同的方法,一下有两种方式,其中一种是我目前使用的数据库未查到归档才换的第二种方式。-----方式一:查询数......
  • LINUX服务器重启Oracle数据库命令
    ---关闭数据库的命令:用oracle用户名和密码登录Oracle数据库后,su -oracle   ---切换成oracle用户登录;sqlplus /nolog ---切换至sqlplus控制台;conn  /as ......