【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

相关文章

Linux cmake 初窥【3】

1.开发背景         基于上一篇的基础上,已经实现了多个源文件路径调用,但是没有库的实现 2.开发需求         基于 cmake 的动态库和静态库的调用 3.开发环境         ubuntu 20.04 + cmake-3.23.1 4.实现步骤 4.1 准备源码文件 基于上个试验的基础上,增加了动态库 LibShare 和 静态库 LibStatic

Linux网络编程---Web服务器

一、简单Web服务器实现 #include <stdio.h>#include <string.h>#include <stdlib.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/wait.h>#include <errno.h>#include <sys/types.h>#include <sys/st

如何在Linux上设置IP

设置动态IP 在Linux上配置动态IP地址,通常是通过DHCP(动态主机配置协议)来实现的。以下是配置动态IP地址的一般步骤: 确认网卡名称: 使用ifconfig或ip addr命令来查看当前系统中的网卡名称。网卡名称通常是以eth、enp或ens开头,例如eth0或enp3s0。 编辑网络配置文件: 使用文本编辑器(如vi、nano等)打开网络接口的配置文件。这个文件的位置和名称取决

linux如何查看websocket的连接

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统  gitee源代码地址 后端代码: https://gitee.com/nbacheng/

编程入门(六)【Linux系统基础操作四】

读者大大们好呀!!!☀️☀️☀️ 🔥 欢迎来到我的博客 👀期待大大的关注哦❗️❗️❗️ 🚀欢迎收看我的主页文章➡️寻至善的主页 文章目录 🔥前言🚀if else条件控制基本的if语句带else的if语句嵌套的if语句具体示例 🚀for 循环具体示例 🚀测试IP地址🚀获取当前主机的IPv4地址列表⭐️⭐️⭐️总结 🔥前言 本系列为Linux基础

【C/C++】Linux下使用system()函数一定要谨慎

曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入。只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值、它所执行命令的返回值以及命令执行失败原因如何定位,这才是重点。当初因为这个函数风险较多,故抛弃不用,改用其他的方法。这里先不说我用了什么方法,这里必须要搞懂system()函数,因为还是有很多人用了system()函数,有时你不得不面对

LINUX任务(jobs)详解

转自 :  http://hi.baidu.com/daweilang/item/58db8d308e54f6d56d15e999   LINUX任务(jobs)详解 在用管理员执行一个命令后,用Ctrl+Z把命令转移到了后台。导致无法退出root的。 输入命令:exit 终端显示:There are stopped jobs. 解决方法: 方法一、输入命令:jobs 终端显

linux 线程管理、同步机制等

线程 学了那么多有关进程的东西,一个作业从一个进程开始,如果你需要执行其他的东西你可以添加一些进程,进程之间可以通信、同步、异步。似乎所有的事情都可以做了。 对的,进程是当初面向执行任务而开发出来的,每个进程代表着一个动作,你可以说一个进程组代表一个任务,或者一个会话代表一个任务,关键是你的任务就是在进程的执行与进程之间的交互中被完成。 但是,我们知道,进程在操作系统中被设计成独立

怎么查看linux文件夹下有多少个文件

ls | wc -w是查看有多少个文件及文件夹 ls | wc -c这个查看目录下多少个文件. 使用wc命令 具体通过wc --help 可以查看。如:wc -l filename 就是查看文件里有多少行       wc -w filename 看文件里有多少个word。       wc -L filename 文件里最长的那一行是多少个字。

Log4j使用详解(log4j.XML格式)——整理

log4j.xml配置详解(原文地址)   首先当然是得到log4j的jar档,推荐使用1.2.X版,下载地址: http://logging.apache.org/log4j/1.2/download.html xml格式的log4j配置文件概述 xml格式的log4j配置文件需要使用org.apache.log4j.xml.DOMConfigurator.configure()方法来