操作系统——Linux信号处理

本文详细介绍了Linux信号处理的基本概念,包括中断、信号、常见信号类型及其处理方式。讨论了信号的来源、捕获机制,以及信号处理函数的注册与使用。还涉及到了信号的发送方法,如键盘快捷键、错误情况、命令和函数。此外,文章阐述了进程休眠、信号集和信号阻塞的概念,并展示了如何使用`sigprocmask`进行信号屏蔽。最后,文章提到了附带数据信息的信号处理和定时器的使用,如`sigaction`和`setitimer`函数的应用。
摘要由CSDN通过智能技术生成

Linux信号处理

一、基本概念

    1、中断

        当程序接收到消息后中止当前正在执行的程序,转而执行其它任务,等其它任务执行完成后再返回,这种执行模式叫做中断

        分为硬件中断和软件中断

    2、信号

        是一种软件中断,由操作系统发出,程序接收后会执行相应的操作

    3、常见的信号

        命令 kill -l 查看所有信号

        SIGINT(2)   Ctrl+c          终止

        SIGQUIT(3)  Ctrl+\          终止+core

        SIGFPE(8)   除零            终止+core

        SIGKILL(9)  终止信号  终止  不能捕获、忽略

        SIGSEGV(11) 非法访问内存    终止+core

    4、不可靠信号和可靠信号

        建立在早期的信号处理机制上(1~31)的信号是不可靠信号

            不支持排队、可能会丢失,如果同一个信号连续产生多次,进程可能只相应了一次

        建立在新的信号处理机制上(34~64)的信号是可靠信号

            支持排队、信号不会丢失

    5、信号的来源

        硬件异常:除零、非法访问内存、未定义的指令、总线错误

        软件异常:通过一些命令、函数产生的信号

    6、信号的处理方式

        1、忽略

        2、终止进程

        3、终止进程并产生core文件(记录内存映像)

        4、停止

        5、继续

        6、捕获并处理   (在信号发生前,先向内核注册一个函数,当信号来临时系统会自动执行该函数)

二、信号捕获  

    typedef void (*sighandler_t)(int);

    功能:说明信号处理函数的格式

    sighandler_t signal(int signum, sighandler_t handler);

    功能:向内核注册一个信号处理函数

    signum:信号编号

    handler:函数指针

        也可使用以下参数

        SIG_IGN 忽略

        SIG_DFL 按默认方式处理

    返回值:

        之前的信号处理方式

#include <stdio.h>

#include <signal.h>

void sigint(int num)

{

    printf("你别乱按!%d\n",num);    

}

int main(int argc,const char* argv[])

{

//  signal(SIGINT,sigint);

//  signal(SIGQUIT,sigint);

    for(int i=1; i<=31; i++)

    {

        signal(i,sigint);  

    }

    for(;;);

}

    注意:

        1、SIGKILL(9)、SIGSTOP(19)信号不能被捕获和忽略处理

        2、当信号处理完后可能会返回产生信号的代码继续运行,如果我们捕获并处理段错误、算术异常等信号可能会产生死循环,正确的处理段错误、算数异常信号应该是备份数据并直接结束程序

        3、有些系统通过signal注册的信号处理函数只能执行一次,如果想要持续有效,可以在信号处理函数中再重新注册一次

        4、子进程会继承父进程的信号处理方式,但是通过exec系列函数创建的子进程,会恢复默认的信号处理方式

   

    信号的发送方式:

    1、键盘

        Ctrl+c

        Ctrl+\

        Ctrl+z 暂停\挂起  fg 继续

    2、错误

        除零

        非法访问内存

        总线错误

    3、命令

        kill -信号编号 进程号

        功能:向指定的进程发送信号

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoyu1381

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值