Linux signal

devtools/2024/10/19 6:16:07/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <errno.h>

/*
 * signal 函数的使用方法简单,但并不属于 POSIX 标准
 *
 * 而 POSIX 标准定义的信号处理接口是 sigaction 函数
 */

#if 0

信号通常用于终止和清理,它们很少被用于编程逻辑。

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

    设置某一信号的对应动作

    第一个参数signum:指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。
    
    第二个参数handler:描述了与信号关联的动作,它可以取以下三种值:

        第一种是我们自己定义的信号处理函数,
        第二种是传入SIG_DFL 表示将之前signal所改变的信号处理方式还原,
        第三种是传入SIG_IGN,表示处理方式为忽略该信号,内核会直接将信号丢弃,不会传递到进程。


    signal(SIGINT, SIG_IGN);    //  忽略 CTRL + C

    #define SIG_IGN  ((__sighandler_t)1)    /* Ignore signal.  */
    #define SIG_ERR  ((__sighandler_t)-1)   /* error return from signal */
    #define SIG_DFL    ((__sighandler_t)0)  /* default signal handling */

    SIG_IGN        : 忽略
    SIG_DFL        : 恢复对信号的系统默认处理


信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据

进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道在处理之前来过多少个


    'CTRL + \ 组合键时,是产生了SIGQUIT信号'


进程对信号的响应

     1. 忽略信号:大部分信号可被忽略,除SIGSTOP和SIGKILL信号外(这是超级用户杀掉或停掉任意进程的手段)。
     2. 捕获信号:注册信号处理函数,它对产生的特定信号做处理。
     3. 让信号默认动作起作用:unix内核定义的默认动作,有5种情况:
        a) 流产abort:终止进程并产生core文件。
        b) 终止stop:终止进程但不生成core文件。
        c) 忽略:忽略信号。
        d) 挂起suspend:挂起进程。
        e) 继续continue:若进程是挂起的,则resume进程,否则忽略此信号。
#endif

static void signal_handler(int signo)
{
    printf("signo %d", signo);
    exit(signo);
}

int main()
{
    if (signal(SIGINT, signal_handler) == SIG_ERR)
        printf("SIGINT erro");
    if (signal(SIGTERM, signal_handler) == SIG_ERR)
        printf("SIGTERM erro");
    if (signal(SIGSEGV, signal_handler) == SIG_ERR)
        printf("SIGSEGV erro");
    if (signal(SIGABRT, signal_handler) == SIG_ERR)
        printf("SIGABRT erro");
    if (signal(SIGFPE, signal_handler) == SIG_ERR)
        printf("SIGFPE erro");
    if (signal(SIGILL, signal_handler) == SIG_ERR)
        printf("SIGILL erro");

    while (1)
        sleep(2);

    return 0;
}


http://www.ppmy.cn/devtools/41171.html

相关文章

OpenAI深夜震撼发布最新模型GPT-4o,送上最快速便捷教程

北京时间5月14日凌晨&#xff0c;有人说OpenAI一夜改变了历史。 在我们的深夜、太平洋时间的上午 10 点&#xff0c;OpenAI 召开春季发布会&#xff0c;公布了最新的GPT-4o模型&#xff0c;o代表Omnimodel&#xff08;全能模型&#xff09;。20多分钟的演示直播&#xff0c;展…

Kasawaki川崎机器人故障维修

在当今的自动化工业领域&#xff0c;川崎工业机器人以其卓越的性能和可靠的工作效率赢得了广泛的赞誉。作为机器人的核心组成部分&#xff0c;伺服电机的作用至关重要。然而&#xff0c;就像所有机械设备一样&#xff0c;也可能会遭遇电机磨损或故障&#xff0c;需要适时的川崎…

什么是SOL链跟单机器人与阻击机器人?

SOL链作为一个快速增长的区块链生态系统&#xff0c;为各种应用程序提供了丰富的发展机会。在SOL链上&#xff0c;智能合约的应用已经开始蓬勃发展&#xff0c;其中包括了许多与加密货币交易相关的应用。在本文中&#xff0c;我们将介绍在SOL链上开发的阻击机器人&#xff08;S…

Cocos creator实现《战机长空》关卡本地存储功能

Cocos creator实现《战机长空》关卡本地存储功能 Cocos creator在开放小游戏过程中&#xff0c;经常会出现设置关卡&#xff0c;这里记录一下关卡数据本地存储功能。 一、关卡设置数据 假如我们有关卡数据如下&#xff0c; let settings [ { level: 1, // 第1关 score: 0,…

Meta最新研究: Flash Attention 为何是系统性能瓶颈?

I. 引言 随着机器学习趋向于更大和更复杂的模型,模型训练过程变得越来越计算和资源密集。生成式AI的出现进一步推动了模型开发的边界,大型语言模型(LLMs)通常在数百或数千个GPU上训练数月。以LLaMA2的70-B参数模型为例,需要1,720,320 GPU小时来训练。对于如此长的训练作业,训练…

[3D基础]Delaunay与Triangulate构网

Delaunay三角剖分&#xff08;Delaunay Triangulation&#xff09;和Triangulate构网是两种常用于生成三角网格的方法&#xff0c;它们都有其独特的特点和应用场景。 Delaunay三角剖分&#xff1a; Delaunay三角剖分是一种经典的三角剖分方法&#xff0c;其特点是任意三角形的外…

【Element-UI快速入门】

文章目录 **Element-UI快速入门****一、Element-UI简介****二、安装Element-UI****三、引入Element-UI****四、使用Element-UI组件****五、自定义Element-UI组件样式****六、Element-UI布局组件****七、Element-UI表单组件****八、插槽&#xff08;Slots&#xff09;和主题定制…

最长回文子串 Java实现和原理

最长回文子串问题概述 最长回文子串问题是一个经典的字符串处理问题&#xff0c;它的目标是找到一个字符串中最长的回文子串。回文是指一个正读和反读都一样的字符串&#xff0c;如 “aba” 或 “level”。这个问题在计算机科学中具有重要的应用价值&#xff0c;如生物信息学中…