【Linux】详解信号的分类&&如何自定义信号的作用

简介: 【Linux】详解信号的分类&&如何自定义信号的作用

一、信号的定义

       Linux系统提供的让用户(进程)给其他进程发送异步信息的一种方式。在操作系统中,信号是一种进程间通讯的有限制的方式,主要用于提醒进程某个事件已经发生。信号在Unix、类Unix以及其他POSIX兼容的操作系统中广泛应用。它作为一种异步的通知机制,当发送给一个进程时,操作系统会中断该进程正常的控制流程。操作系统要可以对信号进行如下的两个操作:

  • 操作系统能够识别一个信号并对该信号进行处理。
  • 因为信号是异步产生的,所以操作系统要能够对到来的信号进行临时保存。

二、信号的分类

kill -l//查看系统中所存在的信号

我们可以看到每一个信号对应一个信号和一个宏名称,以后我们给进程发送信号既可以采用发送数字的形式也可以采用发送宏名称的方式。 这里先认识一个信号,2号信号(SIGINT),用来退出终止进程,下面的例子会用到2号信号。

三、自定义信号的处理方式

       如果我们不对收到的信号做自定义处理方式,那该信号就会按默认的方式进行处理。自定义信号的处理方式在我的理解中有两种,一种是让收到该信号的进程处理我交给它的任务,另外一种是忽略该收到的信号,下面我会对这两种方式进行简单的演示。

3.1、收到该信号的进程处理我交给它的任务

       捕捉信号的函数为signal函数, 其中第一个参数就表示你要给进程发送第几号信号,第二个参数handler就是我们所写的函数,即我们要让进程在收到对应信号时所要执行的动作(替代默认动作),返回值为默认执行动作的函数指针,一般我们设定了新的执行动作就不需要默认执行动作了,所以返回值也可以不用接收。下面是让收到该信号的进程处理我交给它的任务的示例代码:

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
 
void handler(int sig)
{
    std::cout << "收到二号信号,但不退出!" << std::endl;
}
 
int main()
{
    signal(SIGINT, handler);
 
    while (true)
    {
        std::cout << "I am a process! my pid is : " << getpid() << std::endl;
        sleep(1);
    }
 
    return 0;
}

当我不在命令行中发送kill -2指令时,我的这个进程会一直正常打印:

当我给这个进程发送一条二号指令时

该进程收到了2号信号,但已经不再执行原来的终止进程操作,转而执行我交给它的动作。

3.2、忽略收到的信号

忽略收到的信号只需要将signal函数的第二个参数改成SIG_IGN即可。

SIG_IGN在定义中其实就是将数字1强转成为sighandler_t指针

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
 
int main()
{
    signal(SIGINT, SIG_IGN);
 
    while (true)
    {
        std::cout << "I am a process! my pid is : " << getpid() << std::endl;
        sleep(1);
    }
 
    return 0;
}

上面这段代码无论再在命令行中输入kill -2指令都无法将进程终止,因为2号新号已经被忽略了。

进程还是照常运行:

相关文章
|
21天前
|
Java Linux
自定义linux脚本用于快速jar包启动、停止、重启
自定义linux脚本用于快速jar包启动、停止、重启
96 29
|
3月前
|
安全 Linux
【Linux】阻塞信号|信号原理
本教程从信号的基本概念入手,逐步讲解了阻塞信号的实现方法及其应用场景。通过对这些技术的掌握,您可以更好地控制进程在处理信号时的行为,确保应用程序在复杂的多任务环境中正常运行。
178 84
|
4月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
87 26
|
4月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
93 17
|
10月前
|
Linux 网络安全 开发工具
内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
本文介绍了如何基于Linux Kernel 5.15.102版本和BusyBox创建一个自定义的迷你Linux ARM系统,并使用QEMU进行启动和调试,包括内核和BusyBox的编译配置、根文件系统的制作以及运行QEMU时的命令和参数设置。
830 0
内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
|
10月前
|
Linux 调度
Linux0.11 信号(十二)(下)
Linux0.11 信号(十二)
93 1
|
10月前
|
存储 Unix Linux
Linux0.11 信号(十二)(上)
Linux0.11 信号(十二)
75 0
|
Oracle 关系型数据库 MySQL
|
27天前
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
100 32
|
26天前
|
监控 Linux
Linux命令大全:echo与tail实现输出重定向。
这样,我们实现了使用echo和tail命令进行输出重定向的目的。在实际应用中,输出重定向技巧可节省时间,提高工作效率。希望本文内容对您了解和掌握Linux系统中echo与tail命令以及输出重定向的操作有所帮助。
93 27