Linux系统编程(信号处理机制)

news2024/11/23 12:31:35

文章目录

  • 前言
  • 一、中断,异常,信号的区别
  • 二、信号在Linux中的标识
  • 三、信号处理相关函数
  • 四、代码实验
  • 总结


前言

本篇文章我们来讲解信号的处理机制,信号处理在Linux操作系统中必不可少,这一点值得大家注意,信号又会与中断,异常一起讨论,那么下面我们就来看看到底什么是信号吧。

一、中断,异常,信号的区别

中断、异常和信号是计算机系统中的三个相关但不完全相同的概念。它们在发生的时机、触发方式和处理机制上有所不同。

中断(Interrupt):

1.中断是由硬件发出的一种信号,用于打断处理器当前的执行流程,以响应特定的硬件事件或请求。

2.中断可以来自外部设备(例如键盘、鼠标、硬盘控制器)或系统内部(例如定时器、异常或错误)。

3.当发生中断时,处理器会暂停当前的执行并切换到中断处理程序来处理中断事件,然后在处理完中断后回到原来的执行上下文。

异常(Exception):
1.异常是在程序执行期间发生的事件或错误条件,可能导致程序的正常流程中断。

2.异常可以是由硬件错误(例如除零错误、无效的内存访问)或软件错误(例如逻辑错误、非法操作)触发的错误情况。

3.异常通常是同步的,也就是说,它们在执行特定的指令时发生,并由程序自身或相关硬件直接处理。

4.异常的处理方式通常由编程语言、操作系统或硬件定义,可以通过异常处理机制(例如 try-catch 块)捕获和处理。

信号(Signal):

1.信号是一种在软件层面上由操作系统或进程间通信机制发送的异步通知。

2.信号可以用于通知进程发生的特定事件,如用户操作(例如按下 Ctrl+C),操作系统事件(例如进程终止),或由其他进程发送的消息。

3.信号是在进程执行期间以异步方式发出的,可以打断当前的执行流程。

4.信号通常用于处理外部事件或异常情况,例如捕获异常,终止进程或重新启动进程等。

总结:

1.中断是由硬件发出的打断处理器当前执行流程的信号,用于响应硬件事件。

2.异常是在程序执行期间发生的事件或错误条件,用于响应特定的错误情况。

3.信号是在软件层面上由操作系统或进程间通信机制发送的异步通知,用于处理外部事件或异常情况。

它们在触发方式、处理机制和使用场景上有所不同,但都可以用于在计算机系统中处理特定的事件、错误和异常情况。

二、信号在Linux中的标识

每个信号都由一个唯一的数字标识符来表示,这些数字被称为信号编号。

信号编号是整数值,通常用正整数来表示,例如SIGINT、SIGTERM等。这些信号编号定义在系统头文件 <signal.h> 中,并在C语言中使用 SIG 前缀。

以下是一些常见的信号编号及其含义:

SIGHUP (1): 终端挂起或控制进程终止。

SIGINT (2): 使用键盘输入的中断信号。

SIGQUIT (3): 使用键盘输入的退出信号。

SIGILL (4): 非法指令。

SIGABRT (6): 异常终止。

SIGFPE (8): 浮点异常。

SIGKILL (9): 强制进程终止。

SIGALRM (14): 闹钟超时。

SIGTERM (15): 终止请求。

三、信号处理相关函数

signal()

函数原型:

void (*signal(int signum, void (*handler)(int)))(int)

功能:signal() 函数用于注册信号处理函数,指定在接收到特定信号时要执行的操作。

参数:

signum:要捕获和处理的信号编号。
handler:指向信号处理函数的指针,可以是自定义函数或内置的信号处理函数。
返回值:返回一个函数指针,指向以前注册的信号处理函数。

raise()

函数原型:

int raise(int sig)

功能:raise() 函数用于在当前进程内部生成信号。它向当前进程发送指定的信号。
参数:

sig:要发送的信号编号。
返回值:成功时返回0,否则返回一个非零值。

kill()

函数原型:

int kill(pid_t pid, int sig)

功能:kill() 函数用于向指定进程或进程组发送信号。

参数:
pid:要发送信号的进程的进程ID(PID)。可以是正整数值,表示单个进程的PID,也可以是负整数值,表示进程组的PID(将信号发送给该进程组中的所有进程)。
sig:要发送的信号编号。
返回值:成功时返回0,否则返回一个非零值。

这些函数可以一起使用来进行信号的处理。首先,使用 signal() 函数注册信号处理函数,指定接收到特定信号时要执行的操作。然后,可以使用 raise() 函数在当前进程中生成信号,或使用 kill() 函数向其他进程发送信号。

需要注意的是,不同的信号有不同的含义和用途。要正确使用信号处理函数和相关函数,需要了解不同的信号及其处理方式。可以通过查阅相关文档或系统头文件 <signal.h> 了解所有可用的信号及其意义。

四、代码实验

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

void signal_handle(int sig)
{
    printf("sig = %d\n", sig);
}

int main(void)
{

    signal(SIGINT, signal_handle);

    while(1)
    {
        sleep(1);
    }

    return 0;
}

执行效果:
在这里插入图片描述
按下ctrl加c后被信号处理函数捕捉到了,并且打印了信号的数值。

下面的代码演示了怎么样使用信号进行线程之间通信。

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

void signal_handle(int sig)
{
    printf("sig = %d\n", sig);
}

int main(void)
{

    signal(40, signal_handle);

    while(1)
    {
        sleep(1);
    }

    return 0;
}
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
    pid_t pid = atoi(argv[1]);

    kill(pid, 40);

    raise(SIGINT);

    while(1)
    {
        sleep(1);
    }

    return 0;
}

总结

本篇文章就讲解到这里,大家看完后可以好好实验一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/747579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打通前后端 -- 创建第一个JSP页面

前言 JSP是由Sun Microsystems公司主导创建的一种动态网页技术标准。 JSP部署于网络服务器上&#xff0c;可以响应客户端发送的请求&#xff0c;并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页&#xff0c;然后返回给请求者。 JSP技术以Java语言作为脚本语言&…

从0-100:约拍小程序开发笔记

背景 摄影师预约小程序功能是一种方便摄影师和客户之间进行预约和安排拍摄的工具。通过该功能&#xff0c;摄影师可以在小程序上设置自己的可预约时间&#xff0c;客户可以根据摄影师的日程安排选择合适的时间进行预约。这样可以提高预约的效率&#xff0c;减少沟通成本&#…

【工具】tempormonkey 同步插件

tempormonkey 同步插件 1.打开tempormonkey的dashboard界面 2.右上角的setting 3.选择谷歌云盘

数字孪生建筑3D可视化运维管理平台降低成本

深圳是我国数字经济重镇&#xff0c;数字经济核心产业增加值占全市GDP逾三成&#xff0c;数字产业化和产业数字化正呈双向融合发展之势。越来越多的企业正与深圳华锐视点一道&#xff0c;利用互联网、大数据、云计算、人工智能、区块链、5G、数字孪生等技术优势&#xff0c;赋能…

Red Hat Linux官网下载地址

注册一个账号&#xff0c;就可以从官网下载最新版本的Red Hat 企业版Linux。

从0到100:定制公交预约小程序开发笔记

业务背景 可以让用户通过手机随时随地进行公交车的预约&#xff0c;无需排队等候&#xff0c;节省了用户的时间和精力。通过公交预约小程序&#xff0c;用户可以提前预约座位&#xff0c;避免了拥挤和等待时间&#xff0c;提高了公交出行的效率。可以根据用户的预约情况&#…

软考A计划-系统集成项目管理工程师-项目成本管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

k8s 的命名空间一直 Terminating

查看命名空间状态&#xff0c;[NAMESPACE] 处于 Terminating kubectl get ns使用强制删除命令没有效果 kubectl delete namespace [namespace] --force --grace-period0 解决办法&#xff1a;删除部署文件 yaml 中的 finalizers 属性 kubectl get namespace [NAMESPACE] -o …

AIGCxRPA打造更智能的数字员工,帮助千行万业实现新生产力的跃升

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 金融行业&#xff0c;长久以来一直是新科技的最佳试验场。作为一个高度数字化、信息密集的行业&#xff0c;金融业对于新科技的吸纳和应用具有天然的优势和需求。数字经济的崛起&#xff0c;更加快了金融行业对智能化的渴望…

低代码开发的兴衰

刚才在思考写一个PPT&#xff0c;然后留下一些辅料&#xff0c;给大家分享出来。 &#xff08;1&#xff09;DOS时代的爽&#xff1a;1981-1995 一、Dbase&#xff1a;一体化&#xff0c;前中后端都搞定 1、后端-数据层&#xff1a;数据库系统&#xff08;DBASE本质其实是个单机…

RPC分布式网络通信框架(四)—— 异步日志模块设计

文章目录 异步日志模块Logger类实现线程安全LockQueue类实现 异步日志模块 问题&#xff1a;由于RPC服务器端采用了epoll&#xff0b;多线程 &#xff0c;并发处理来自客户端的请求&#xff0c;所以有可能造成多线程同时写日志信息。 将日志信息写入一个queue中&#xff0c;然…

MySQL select查询练习

一、创表并插入数据 创表&#xff1a; CREATE TABLE worker (部门号 int NOT NULL,职工号 int NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10) NOT NULL DEFAULT 群众,姓名 varchar(20) NOT NULL,出生日期 date NOT NULL,性别 char(1) DEFAU…

【ElasticSearch】ES与MySQL数据同步方案及Java实现

文章目录 一、同步实现思路1、方案一&#xff1a;同步调用2、方案二&#xff1a;异步通知3、方案三&#xff1a;监听binlog 二、实现ES与MySQL数据同步1、导入hotel-admin工程2、项目分析3、SpringAMQP整合4、声明队列和交换机5、发送消息MQ6、监听MQ消息7、测试同步功能 一、同…

一百二十九、Kettle——从MySQL增量导入到GreenPlum

一、目标 用Kettle从MySQL增量导入数据到GreePlum 二、前提准备 &#xff08;一&#xff09;kettle已连上MySQL &#xff08;二&#xff09;kettle已连上GreenPlum 三、实施步骤 &#xff08;一&#xff09;打开kettle&#xff0c;新建转换任务。拖拽2个表输入、替换NULL…

【Doris的安装和使用】

1.准备工作 1.1集群规划 1.2 操作系统安装要求 设置系统最大打开文件句柄数(注意这里的*不要去掉) sudo vim /etc/security/limits.conf * soft nofile 65536 * hard nproc 65536设置最大虚拟块的大小 sudo vim /etc/sysctl.conf vm.max_map_count2000000将修改的配置分发给…

麒麟-飞腾Kylin-V4桌面arm64系统静态编译QT

1.系统具体版本&#xff1a; 2. 因为此版本的源很老了&#xff0c;需要修改版本的源&#xff0c;才能正常更新各种软件&#xff0c;否则&#xff0c;你连麒麟商店都打不开。 sudo vi /etc/apt/sources.list 选择你系统对应版本的源地址&#xff1a; #4.0.2桌面版本: deb ht…

k8s 中的卷

前面的文章我们分享了 pod &#xff0c;RC&#xff0c;RS&#xff0c;DaemonSet&#xff0c;CJ&#xff0c;Service 等各种资源 今天我们来分享一波如何将磁盘挂载到容器中&#xff0c;在 docker 里面这种技术叫做 数据卷&#xff0c;感兴趣的小伙伴可以查看一下文章&#xff…

JDK环境配置、且运行一个简单程序

目录 JDK环境配置命令行运行java文件 JDK环境配置 下载好jdk,打开jdk下的bin&#xff0c;复制路径。 右击我的电脑&#xff0c;点击属性&#xff0c;找到高级系统设置&#xff0c;点击环境变量。 双击path&#xff0c;新建把路径粘贴进去即可。 打开cmd输入javac -version…

不会编程也可以制作ERP、CRM系统?

在以往的编程开发中&#xff0c;如果想要个人开发一款简单的ERP等流程系统&#xff0c;肯定是需要有编程代码的功底的&#xff0c;再学习编程语言和框架&#xff0c;又得花费大量的时间&#xff0c;而且不能完全确保可以做出来&#xff0c;毕竟编程开发有一定的门槛&#xff0c…

3d Max中的Arnold渲染为黑色,这样处理!

使用Arnold渲染视图(ARV)时&#xff0c;图像保持黑色。 快照功能和常规3ds Max渲染设置可按预期生成图像。 解决方案&#xff1a; 解决方案可能需要执行下面的一项或多项操作&#xff1a; 添加光源 检查场景文件是否包含光源。如果场景中没有光源&#xff0c;渲染结果为黑色…