【Linux】详解信号产生的方式

2024-04-26 18:36

本文主要是介绍【Linux】详解信号产生的方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、kill命令

在命令行中通过kill -数字 pid指令可以给指定进程发送指定信号。这里说明一下几个常见的信号:

  • SIGINT(2号信号):中断信号,通常由用户按下Ctrl+C产生,用于通知进程终止。
  • SIGQUIT(3号信号): 终止进程并产生core文件,用于后续分析程序崩溃时的状态和数据。
  • SIGKILL(9号信号):强制终止信号,不能被进程捕获或阻塞,用于强制结束进程。
  • SIGSTOP(20号信号):停止信号,使进程停止执行,直到收到SIGCONT信号。
  • SIGCONT(18号信号):继续信号,使之前被SIGSTOP信号停止的进程继续执行。
  • SIGALRM(14号信号):闹钟信号,当由alarm函数设置的定时器时间已经超过时产生。

        如果想查阅更多的信号,可以使用man 7 signal指令在官方手册中进行查找。

二、键盘产生信号

        不同的操作系统产生信号的键盘组合键可能不同,这里说的是ubuntu系统下。常见的键盘产生的信号有:

ctrl + c:向当前进程发送2号信号。

ctrl + \:向当前进程发送3号信号。

ctrl + z:向当前进程发送20号信号。 

三、系统调用产生信号

3.1、kill系统调用函数

 

二号手册查询。pid就是进程pid,指要向哪一个进程发信号,sig指要发送几号命令。

3.2、raise系统调用函数

三号手册查询。raise就是一个用来给进程自己发信号的系统调用函数。sig指要发送哪一个信号。

3.3、abort系统调用函数

三号手册。abort系统调用函数就是一个用来给进程自己发送6号信号的系统调用函数。 

四、软件条件产生信号

        在操作系统中,由软件条件产生的信号通常指的是通过某种软件操作或系统状态触发的信号。这些信号用于通知进程某个特定事件已经发生。下面会说明常见的软件条件:

4.1、管道通信

【Linux】匿名管道实现简单进程池-CSDN博客之前在这一篇博客中,我已经介绍了进程间使用管道通信的四种情况和五种特性,其中在第四种情况中,我曾经说过,读端关闭了,操作系统就会发送信号直接杀死进行写入的进程,因为没有读端写入也就没有了意义。此时操作系统给写端进程发送的正是SIGPIPE(十三号信号)直接终止写端进程。

4.2、时钟信号

         调用alarm函数可以设定一个闹钟,也就是告诉内核在seconds秒之后给当前进程发SIGALRM信号, 该信号的默认处理动作是终止当前进程 
#include <unistd.h>
unsigned int alarm(unsigned int second);
         second参数设置的是经过多少秒后向该进程发送时钟信号函数的返回值是0或者是以前设定的闹钟时间还余下的秒数
#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;void handler(int signo)
{cout << "hello signal" << endl;
}int main()
{signal(SIGALRM, handler);//5秒后闹钟响起,执行自定义方法alarm(5);while (true){cout << "I am a process! my pid is " << getpid() << endl;sleep(1);}return 0;
}
经过5秒,我们果然看到了进程收到了闹钟信号,执行了自定义方法。

        但如果我们前一个闹钟还没响我们又设了一个闹钟,新设置的闹钟先响了这时alarm函数的返回值就是以前设定的闹钟时间还余下的秒数。假设我此时先设置了一个500秒以后才响的闹钟,在自定义函数中又设置了5秒以后响的闹钟,然后在命令行中给这个进程提前发送闹钟信号。看代码和结果:

#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;void handler(int signo)
{cout << "hello signal" << endl;//又设置了一个5秒后响的闹钟unsigned int n = alarm(5);cout << "还剩" << n << "秒" << endl;
}int main()
{signal(SIGALRM, handler);alarm(500);while (true){cout << "I am a process! my pid is " << getpid() << endl;sleep(1);}return 0;
}

  此时在命令行中提前发送闹钟信号:

        我们可以看到第二个设置的闹钟的返回值为490,也就是上一个闹钟还没有跑完的时间。之后就是每隔5秒闹钟响一次。 

五、异常产生信号

        常见的进程出异常产生信号有除0异常,操作系统会向进程发送8号信号(SIGFPE)。野指针,操作系统会向进程发送11号信号(SIGSEGV)。

这篇关于【Linux】详解信号产生的方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/938345

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2