linux信号处理机制

这篇具有很好参考价值的文章主要介绍了linux信号处理机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        信号检测是项目开发中必不可少的!提到信号处理机制,很多人都会想到signal函数吧

void handle_signal(int signal) {
    printf("接收到信号: %d\n", signal);
    if(SIGINT == signo)
    {}
    else if(SIGTERM == signo)
    {}
    // 退出程序
    exit(signal);
}
int main() {
    // 注册信号处理函数
    signal(SIGINT, handle_signal);  // 当接收到中断信号(SIGINT)时调用handle_signal函数
}

        除了这种方式,还有一种操作信号集的方式更为精确,能够屏蔽,添加,删除,操作等某个信号。这些函数仅支持对 POSIX 信号集进行操作。首先了解下这几个函数:

int sigemptyset(sigset_t *set)

描述:

        清空信号集set

参数:

        set:用来存储信号集的值

返回值:

        成功:0;失败:-1

int sigfillset(sigset_t *set)

描述:

        将信号集set填满;就是把所有的信号都放在这个集合里;但是不会包含 NPTL 线程实现内部使用的两个实时信号:SIGCANCEL和SIGSETXID

参数:

        set:用来存储信号集的值

返回值:

        成功:0;失败:-1

int sigaddset(sigset_t *set, int signum)

描述:

        将某个信号signum添加到信号集set

参数:

        set:信号集

        signum:某种信号

返回值:

        成功:0,失败:-1

int sigdelset(sigset_t *set, int signum)

描述:

        将某个信号signum从信号集中删除

参数:

        set:信号集

        signum:某个信号

返回值:

        成功:0;失败:-1

int sigismember(const sigset_t *set, int signum)

描述:

        检查某个信号signum是否在信号集set中

参数:

        set:信号集

        signum:某个信号

返回值:

        包含:1;不包含:0;失败:-1

int sigaction(int signum, const struct sigaction *act,
 struct sigaction *oldact);

描述:

        指定进程在接收特定信号时采取的操作。

参数:

        signum:某个信号

        act:用于指定新的信号处理程序。

        oldact:用于存储之前的信号处理程序的信息。

struct sigaction {
    void     (*sa_handler)(int);    /*指定信号处理程序的函数指针。可以将其设置为自定义的信号处理函数,或者将其设置为 
                                    SIG_DFL 表示使用默认的处理程序,或者将其设置为 
                                    SIG_IGN 表示忽略该信号。*/
    void     (*sa_sigaction)(int, siginfo_t *, void *); /*这个字段也是一个信号处理程序的函数指针,与 sa_handler 字段类似。但与 sa_handler 不同的是,
                                    它可以传递更多的关于信号的信息给信号处理程序。它接收三个参数:
                                    int signum:触发信号的编号
                                    siginfo_t *siginfo:一个指向siginfo_t 结构的指针,它包含有关信号的详细信息,例如发送信号的进程 ID。
                                    void *context:一个指向信号上下文的指针,提供有关信号和进程状态的信息。*/
    sigset_t   sa_mask;            //信号集
    int        sa_flags;    //指定一些标志来控制信号处理的行为,例如是否自动重启被中断的系统调用或是否启用信号处理程序的扩展功能。正常使用设置为0即可
    void     (*sa_restorer)(void);//一个指向信号上下文的指针,提供有关信号和进程状态的信息。
};

返回值:

        成功:0;失败:-1

        注意:SIGKILL和SIGSTOP这两个信号不在处理范围内,SIGKILL和SIGSTOP是两个特殊的信号,具有特殊的行为和权力。它们被操作系统保留用于强制终止进程的目的,并且无法被捕捉、阻塞或忽略。由于其特殊性质,不能通过sigaction()系统调用来更改它们的默认处理行为,也无法为它们设置自定义的信号处理程序。

示例程序:文章来源地址https://www.toymoban.com/news/detail-819112.html

static void sigHandler [[noreturn]] (int sig)
{
    switch (sig)
    {
    case SIGINT:
    case SIGQUIT:
    case SIGTERM:
    case SIGHUP:
    default:
    }
    exit(1);
}
static void setUpUnixSignals(std::vector<int> quitSignals)
{
    sigset_t blocking_mask;
    sigemptyset(&blocking_mask);//清空信号集
    for (auto sig : quitSignals)
        sigaddset(&blocking_mask, sig);//将信号添加到信号集

    struct sigaction sa;
    sa.sa_handler = sigHandler;
    sa.sa_mask = blocking_mask;
    sa.sa_flags = 0;

    for (auto sig : quitSignals)
        sigaction(sig, &sa, nullptr);//激活信号集
}
int main()
{
    std::vector<int> sigs{SIGQUIT, SIGINT, SIGTERM, SIGHUP};
    setUpUnixSignals(sigs);
}

到了这里,关于linux信号处理机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【linux 多线程并发】多线程模型下的信号通信处理,与多进程处理的比较,属于相同进程的线程信号分发机制

    ​ 专栏内容 : 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的情况下对故障容灾的支持。 手写数据库toadb 本专栏主要介绍如何从零开发,开发的

    2024年01月17日
    浏览(49)
  • 【嵌入式环境下linux内核及驱动学习笔记-(5-驱动的并发控制机制)】

    在讨论并发前,先要了解以下几个概念:执行流,上下文,共享与临界等。 什么叫执行流: 【执行流】:有开始有结束总体顺序执行的一段代码 又称 上下文 。 上下文分类: 【任务上下文】:普通的,具有五种状态(就绪态、运行态、睡眠态、暂停态、僵死态),可被阻塞

    2023年04月21日
    浏览(50)
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第六天-Linux信号(物联技术666)

     更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客 物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单

    2024年01月19日
    浏览(57)
  • ECF机制:信号处理

       ​​​​​​​ 📜 本章目录: 0x00 观察接收信号 0x01 阻塞和解除阻塞信号 0x02 安全的信号处理 0x03 在信号处理器中使用安全的 I/O 函数 0x04 便携式信号处理 0x05 显式信号等待 0x00 观察接收信号 假设内核从异常处理程序中返回,并准备将控制权交给进程 : 代码层级上看

    2024年02月01日
    浏览(39)
  • lv3 嵌入式开发-3 linux shell命令(文件搜索、文件处理、压缩)

    目录 1 查看文件相关命令 1.1 常用命令 1.2 硬链接和软链接 2 文件搜索相关命令 2.1 查找文件命令 2.2 查找文件内容命令 2.3 其他相关命令 3 文件处理相关命令 3.1 cut  3.2 sed 过滤 3.3 awk 匹配 4 解压缩相关命令 4.1 解压缩文件的意义 4.2 解压缩相关命令 cat - concatenate files and pri

    2024年02月10日
    浏览(64)
  • 嵌入式QT (Qt 信号与槽)

    因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。 信号 (Signal)就是在特定情况下被发射的事件。 GUI 程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就

    2024年02月02日
    浏览(51)
  • 【嵌入式开发 Linux 常用命令系列 7.4 -- awk 处理文件名,去除后缀只保留文件名】

    请阅读 【嵌入式开发学习必备专栏 】 在 shell 中, 可以使用 awk 来处理文件名,去除其后缀。下面是一个示例命令,它会将带有后缀的文件名作为输入,并输出没有后缀的文件名: 这个命令片段做了以下几件事情: -F\\\".\\\" 设置了输入字段的分隔符为点号( . ),这是文件后缀

    2024年04月08日
    浏览(63)
  • 嵌入式实时操作系统的设计与开发(信号量学习)

    除了临界点机制、互斥量机制可实现临界资源的互斥访问外,信号量(Semaphore)是另一选择。 信号量与互斥量的区别 对于互斥量来说,主要应用于临界资源的互斥访问,并且能够有效地避免优先级反转问题。 对于信号量而言,它虽然也能用于临界资源的互斥访问,但是不能

    2024年02月08日
    浏览(59)
  • 【linux】信号——信号保存+信号处理

    自我名言 : 只有努力,才能追逐梦想,只有努力,才不会欺骗自己。 喜欢的点赞,收藏,关注一下把! 上一篇博客,我们已经学过信号预备知识和信号的产生,今天讲讲信号保存+信号处理以及其他补充知识。 补充一些概念。 实际执行信号的处理动作称为 信号递达(Delive

    2024年02月04日
    浏览(45)
  • 嵌入式I2C 信号线为何加上拉电阻(图文并茂)

    IIC 是一个两线串行通信总线,包含一个 SCL 信号和 SDA 信号,SCL 是时钟信号,从主设备发出,SDA 是数据信号,是一个双向的,设备发送数据和接收数据都是通过 SDA 信号。   在设计 IIC 信号电路的时候我们会在 SCL 和 SDA 上加一个上拉电阻。   今天就来分享下,为什么要在

    2024年02月19日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包