Linux信号实践(1) --Linux信号编程概述

简介: 中断    中断是系统对于异步事件的响应, 进程执行代码的过程中可以随时被打断,然后去执行异常处理程序;    计算机系统的中断场景:中断源发出中断信号 -> CPU判断中断是否屏蔽屏蔽以...

中断

    中断是系统对于异步事件的响应, 进程执行代码的过程中可以随时被打断,然后去执行异常处理程序;

    计算机系统的中断场景:中断源发出中断信号 -> CPU判断中断是否屏蔽屏蔽以及保护现场 -> CPU(查询中断向量表, 找到中断服务程序的入口地址)执行中断处理程序 ->(处理完中断之后) ->恢复现场,继续执行原来的任务

 

中断分类

硬件中断(外部中断)

  外部中断是指由外部设备通过硬件请求的方式产生的中断,也称为硬件中断

软件中断(内部中断)

  内部中断是由CPU运行程序错误或执行内部程序调用引起的一种中断,也称为软件中断(如:执行除0操作, 由用户空间陷入内核空间等)。

 

信号

  信号是UNIX/Linux系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动。信号一般是因为某些错误条件而产生的,比如内存段冲突、浮点处理器错误或者非法指令等;信号是在软件层次上对中断的一种模拟,所以通常把它称为是软中断;

 

信号与中断的相似点:

(1)采用了相同的异步通信方式

(2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;

(3)都在处理完毕后返回到原来的断点

(4)对信号或中断都可进行屏蔽

 

信号与中断的区别:

(1)中断有优先级,而信号没有优先级,所有的信号都是平等的;

(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;

(3)中断响应是及时的,而信号响应通常都有较大的时间延迟

 

常用信号

信号名称

描述

SIGABRT(6)

进程停止运行 

SIGALRM

警告钟

SIGFPE

算述运算例外(如除0)

SIGHUP

系统挂断

SIGILL

非法指令

SIGINT(2)

终端中断  

SIGKILL

停止进程(此信号不能被忽略或捕获)

SIGPIPE

向没有读者的管道写入数据

SIGSEGV

无效内存段访问

SIGQUIT

终端退出   

SIGTERM

终止

SIGUSR1

用户定义信号1

SIGUSR2

用户定义信号2

SIGCHLD

子进程已经停止或退出

SIGCONT

如果被停止则继续执行

SIGSTOP

停止执行

SIGTSTP

终端停止信号

SIGTOUT

后台进程请求进行写操作

SIGTTIN

后台进程请求进行读操作

 

进程对信号的响应 

忽略信号  

  不采取任何操作、有两个信号不能被忽略:SIGKILL和SIGSTOP。

  [为什么进程不能忽略SIGKILL/SIGSTOP信号。(如果应用程序可以忽略这2个信号,系统管理无法杀死、暂停进程,无法对系统进行管理。)]

捕获并处理信号   

  内核中断正在执行的代码,转去执行先前注册过的处理程序。

执行默认操作   

  默认操作通常是终止进程,这取决于被发送的信号。

 

信号的默认操作:通过 man 7 signal 查看

 

信号安装-signal

typedef void (*__sighandler_t) (int);
#define SIG_ERR ((__sighandler_t) -1)
#define SIG_DFL ((__sighandler_t) 0)
#define SIG_IGN ((__sighandler_t) 1)
__sighandler_t signal(int signum, __sighandler_t handler);

参数

  signal是一个带signum和handler两个参数的函数,准备捕捉或屏蔽的信号由参数signum给出,接收到指定信号时将要调用的函数由handler给出

  handler这个函数必须有一个int类型的参数(即接收到的信号代码),它本身的类型是void, handler也可以是下面两个特殊值:

SIG_IGN 屏蔽该信号

SIG_DFL 恢复默认行为

//示例1
void handler(int sigNum)
{
    cout << "recv a signal = " << sigNum << endl;
}

int main(int argc, char *argv[])
{
    signal(SIGINT, handler);
    while (true)
        sleep(1);
}

RETURN VALUE

 signal() returns the previous value of the signal handler, or SIG_ERR on error.   

 In  the event of an error, errno is set to indicate the cause.

int main(int argc, char *argv[])
{
    sighandler_t oldHandler = signal(SIGINT, handler);
    if (oldHandler == SIG_ERR)
        err_exit("signal error");

    while (getchar() != '\n')
        sleep(1);

    // 等价于 signal(SIGINT, SIG_DFL)
    if (signal(SIGINT, oldHandler) == SIG_ERR)
        err_exit("signal error");

    while (true)
        sleep(1);
}
//实例: 捕获所有信号, 并打印信号的信息
int main()
{
    for (int i = 1; i < NSIG; ++i)
    {
        if (signal(i, sigHandler) == SIG_ERR)
        {
            cerr << "signal " << i << ": " << strsignal(i) << " set error";
            cerr << ", errno desc: " << strerror(errno) << endl;
        }
    }

    while (true)
        pause();
}

void sigHandler(int signo)
{
    cout << "catch a signal, signo = " << signo << ", desc: " << strsignal(signo) << endl;
}


目录
相关文章
|
6月前
|
监控 Linux 应用服务中间件
Linux多节点多硬盘部署MinIO:分布式MinIO集群部署指南搭建高可用架构实践
通过以上步骤,已成功基于已有的 MinIO 服务,扩展为一个 MinIO 集群。该集群具有高可用性和容错性,适合生产环境使用。如果有任何问题,请检查日志或参考MinIO 官方文档。作者联系方式vx:2743642415。
2183 57
|
8月前
|
安全 Linux
【Linux】阻塞信号|信号原理
本教程从信号的基本概念入手,逐步讲解了阻塞信号的实现方法及其应用场景。通过对这些技术的掌握,您可以更好地控制进程在处理信号时的行为,确保应用程序在复杂的多任务环境中正常运行。
303 84
|
6月前
|
安全 算法 Ubuntu
Linux(openssl)环境:编程控制让证书自签的技巧。
总结:在Linux环境中,OpenSSL是一个非常实用的工具,可以帮助我们轻松地生成自签名证书。通过上述三个简单步骤,即可为内部网络、测试环境或开发环境创建自签名证书。但在公共访问场景下,建议购买经过权威认证机构签发的证书,以避免安全警告。
305 13
|
8月前
|
JavaScript Ubuntu Linux
如何在阿里云的linux上搭建Node.js编程环境?
本指南介绍如何在阿里云Linux服务器(Ubuntu/CentOS)上搭建Node.js环境,包含两种安装方式:包管理器快速安装和NVM多版本管理。同时覆盖全局npm工具配置、应用部署示例(如Express服务)、PM2持久化运行、阿里云安全组设置及外部访问验证等步骤,助你完成开发与生产环境的搭建。
|
9月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
176 26
|
9月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
183 17
|
2月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
413 1
二、Linux文本处理与文件操作核心命令
|
2月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
289 137
|
2月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
665 57
|
1月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
372 2
下一篇
oss云网关配置