软中断通信及signal()解读

news2025/1/20 2:36:41

目录

 软中断通信

signal()

概述

signal()类似的函数

signal()之SIGINT

signal()之SIGTERM 

signal()之SIGALRM 

signal()之SIGQUIT 

 SIG_IGN使用


 软中断通信

进程间通信方式有多种,其中软中断通信是一种常见的方式,它基于信号机制,可以在不同进程之间进行通信。软中断通信的实现方式是,一个进程向另一个进程发送一个特定的信号,该信号被接收进程捕获,并进行相应的处理。

软中断通信的步骤如下:
1)发送进程通过kill()函数向接收进程发送信号,信号类型可以自行指定。
2)接收进程可以通过signal()函数注册对应信号的处理函数,或者其他类似函数指定对应信号的处理方式。
3)当接收进程接收到信号后,操作系统会暂停接收进程的正常执行流程,转而执行对应信号的处理函数或处理方式。
4)处理完信号后,操作系统会恢复接收进程的正常执行流程。

需要注意的是,软中断通信是一种异步通信方式,即发送进程和接收进程之间并不存在直接的同步机制。发送进程只是向接收进程发送信号,而接收进程并不知道具体何时会收到信号,需要通过注册信号处理函数或处理方式来实现对信号的处理。因此,在设计使用软中断通信的系统时,需要充分考虑这种异步机制所带来的影响。

signal()

概述

signal()函数是UNIX/Linux中的一个系统调用,用于注册信号处理程序。信号是操作系统中的一种通知机制,用于通知进程发生了某些事件,比如接收到了外部中断、收到了某个进程发送的信号等等。当系统接收到信号时,会中断进程的正常执行流程,转而执行信号处理程序。

signal()函数用于注册信号处理程序。当进程收到指定的信号时,就会执行注册的信号处理程序。handler可以是一个函数指针,也可以是SIG_IGN或SIG_DFL。如果handler是一个函数指针,则会将其作为信号处理程序进行注册。如果handler是SIG_IGN,则表示忽略该信号,不进行任何处理。如果handler是SIG_DFL,则表示采用系统默认的信号处理方式。

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

其中,signum是信号的编号,handler是指向信号处理程序的函数指针。函数的返回值是原来的信号处理程序。 

signal()类似的函数

除了signal函数之外,还有一些类似的函数,它们都是用
于处理进程中的信号的:
1)sigaction函数:与signal函数不同,sigaction函数可以设置信号的处理方式,包括捕获信号、忽略信号、恢复默认处理方式等。
2)sigprocmask函数:用于设置进程的信号掩码,控制哪些信号可以被当前进程接收。
3)sigsuspend函数:用于暂时挂起当前进程,等待接收某个指定信号。当该信号接收到后,进程会恢复执行。
4)sigqueue函数:用于向指定进程发送一个指定信号,并附带一个整型值作为附加数据。
5)raise函数:用于向当前进程发送一个指定信号,等效于使用kill函数向自身发送信号。
这些函数在处理信号方面具有不同的特点和用途,开发者可以根据自己的需求选择适合的函数进行使用。

signal()之SIGINT

SIGINT是一个由键盘生成的信号,表示中断进程。当用户在控制终端上按下Ctrl + C组合键时,就会向前台进程组的所有进程发送SIGINT信号。

//简单的SIGINT示例
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void sigint_handler(int signum) {
    printf("Received SIGINT signal. Terminating.\n");
    exit(0);
}
int main() {
    signal(SIGINT, sigint_handler);
    printf("Press Ctrl+C to terminate the program.\n");
    while (1) {
        // Do nothing
    }
    return 0;
}

signal()之SIGTERM 

SIGTERM是一个在进程终止时发送给进程的终止信号。它允许进程进行一些清理工作并优雅地终止,因为接收到SIGTERM信号的进程可以捕获该信号并执行一些清理操作,然后终止进程。如果进程未处理SIGTERM信号,操作系统会默认终止该进程。
与SIGKILL信号不同,SIGTERM信号可以被进程捕获并处理,而且该信号的行为是可以配置的。因此,通常建议在需要停止进程时首先尝试发送SIGTERM信号,以便进程有机会清理自己并正常终止。例如,可以通过在进程中注册一个信号处理函数来处理SIGTERM信号。

//简单的SIGTERM示例
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void sigterm_handler(int signum) {
    printf("Received SIGTERM signal, terminating process...\n");
    exit(0);
}
int main() {
    // 注册SIGTERM信号处理函数
    signal(SIGTERM, sigterm_handler);
    printf("Process is running...\n");
    while(1) {
    // 进程执行某些操作
        sleep(1);
    }
    return 0;
}

signal()之SIGALRM 

SIGALRM 是一个定时器信号,当 alarm()或 setitimer() 设置的计时器到时时,会发送 SIGALRM 信号。在使用 signal() 函数捕捉 SIGALRM 信号时,需要注意以下几点:
1)SIGALRM 信号的处理函数应该尽可能地简单,因为它通常是在定时器到时时被处理的,可能会影响程序的运行速度。
2)在处理 SIGALRM 信号时需要考虑到并发的情况,因为可能存在多个 SIGALRM信号同时到达的情况,需要采用适当的并发控制措施。
3)用alarm() 或 setitimer() 设置计时器,若处理完 SIGALRM 信号后想继续收到SIGALRM 信号时能够再次处理,需要重新设置计时器。

//简单的SIGTERM示例
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void sigalrm_handler(int signo) {
    printf("Caught SIGALRM signal.\n");
    // reset timer
    //alarm(5);
    exit(0);
}
int main() {
    // set timer
    alarm(5);
    // register signal handler
    signal(SIGALRM, sigalrm_handler);
    // wait for signal
    while(1) {
        sleep(1);
    }
    return 0;
}

signal()之SIGQUIT 

SIGQUIT信号是一个终止进程的信号,可以通过在终端中按下 Ctrl+\(CTRL + 反斜线)来发送该信号。当进程接收到SIGQUIT信号时,它会强制退出,并在退出之前生成一个内核映像(core dump)。在C语言中,可以使用signal函数来注册SIGQUIT信号的处理程序。

//简单的SIGQUIT示例
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void quit_handler(int signum) {
    printf("Received SIGQUIT signal (%d), terminating.\n", signum);
    exit(0);
}
int main() {
    // 注册SIGQUIT信号处理函数
    signal(SIGQUIT, quit_handler);
    printf("Press Ctrl+\\ to terminate the program.\n");
    while (1) {
        // 进程执行的操作
    }
    return 0;
}

 SIG_IGN使用

使用SIG_IGN参数,表示忽略该信号,程序不会受到该信号的影响。例如:

signal(SIGINT, SIG_IGN); 表示在收到 SIGINT(即中断信号,一般是由用户按下 Ctrl-C 触发)时,将其忽略,即不对其进行任何处理。这通常是为了防止用户不小心按下 Ctrl-C 导致程序异常退出,而将其设为忽略状态。

signal (SIGQUIT, SIG_IGN); 这段代码使用了signal()函数,用于改变程序收到SIGQUIT信号(通常由用户在终端上键入“Ctrl+\”产生)的行为。具体来说,使用了SIG_IGN参数,表示忽略该信号,程序不会受到该信号的影响。

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

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

相关文章

【mysql】索引存储结构B+树

参考&#xff1a; https://zhuanlan.zhihu.com/p/545113372 https://www.bilibili.com/read/cv18157852 Mysql数据库引擎默认使用InnoDB&#xff0c;使用B树数据结构。 一个表只能有一个聚簇索引&#xff0c;但可以有多个非聚簇索引&#xff0c;也就是多个索引目录提供数据检索…

coord软件的一些操作

文章目录 1. 大地坐标&#xff08;B&#xff0c;L&#xff09;转换为平面坐标&#xff08;X&#xff0c;Y&#xff09;操作流程示例 2. 大地坐标系下的平面坐标转换&#xff08;X&#xff0c;Y&#xff09;为大地坐标&#xff08;B&#xff0c;L&#xff09;操作示例 3. 6带坐标…

docker专题系列之十六:安装mycat

由于docker镜像仓库中mycat镜像比较少或相对比较旧&#xff0c;因此一般使用手动制作镜像方式安装部署。下文&#xff0c;良哥通过实验&#xff0c;分别介绍两种方式下如何安装部署mycat。 一、手动制作镜像方式 1.创建镜像 #创建工作目录 mkdir /usr/rdc mkdir /usr/rdc/my…

GOLANG进阶:Viper,Mysql,Swagger,Log

GOLANG从浅入深必须学习的一些工具包 1.Viper&#xff1a; Viper 是一个完整的 Go 应用程序配置解决方案&#xff0c;优势就在于开发项目中你不必去操心配置文件的格式而是让你腾出手来专注于项目的开发。其特性如下&#xff1a; 支持 JSON/TOML/YAML/HCL/envfile/Java proper…

【Java-数据结构】指定ArrayList 数组的大小有利于数据扩容和缩短耗时

关键 “因为扩容操作涉及内存申请和数据搬移&#xff0c;是比较耗时的。所以&#xff0c;如果事先能确定需要存储的数据大小&#xff0c;最好在创建 ArrayList 的时候事先指定数据大小。” 如下代码所示&#xff1a; ArrayList<User> users new ArrayList(10000); fo…

LogicFlow 在HTML中的引入与使用

LogicFlow 在HTML中的引入与使用 LogicFlow的引入与使用&#xff0c;相较于BPMNJS相对容易一些&#xff0c;更加灵活一些&#xff0c;但是扩展代码可能写得更多一些。 示例展示 示例代码 github: https://github.com/iotzzh/origin-examples/blob/main/%E6%B5%81%E7%A8%8B%E5%9…

SpringBoot2+Vue2实战(十)权限管理

一、父子菜单实现 新建数据库表 sys_menu sys_role 实体类 Role import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName;import java.io.Serializable;import l…

分析入手新项目后前后端的接口调用位置以及sql情况

文章目录 查看前端查看后端sql分析数据库分析作者的话 查看前端 比如我们的userList的一个功能&#xff0c;我们刷新页面后会发现当前页面有很多请求&#xff0c;我们根据请求header和param来分析&#xff0c;当前的“用户列表”接口是哪个请求&#xff0c; 我们填入一个参数…

C++ PCL三维点云物体目标识别

程序示例精选 C PCL三维点云物体目标识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<C PCL三维点云物体目标识别>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff…

web学习--maven--项目管理工具

写在前面&#xff1a; 这学期搞主攻算法去了&#xff0c;web的知识都快忘了。开始复习学习了。 文章目录 maven介绍功能介绍maven安装jar包搜索仓库 pom文件项目介绍父工程依赖管理属性控制可选依赖构建 依赖管理依赖的传递排除依赖可选依赖 maven生命周期分模块开发模块聚合…

《安全软件开发框架(SSDF) 1.1:降低软件漏洞风险的建议》解读(三)

安全软件开发框架SSDF是由美国国家标准与技术研究院发布的关于安全软件开发的一组实践&#xff0c;帮助开发组织减少发布的软件中的漏洞数量&#xff0c;减少利用未检测到或未解决的漏洞的潜在影响&#xff0c;从根本上解决漏洞防止再次发生。本文根据《Secure Software Develo…

【Nginx05】Nginx学习:HTTP核心模块(二)Server

Nginx学习&#xff1a;HTTP核心模块&#xff08;二&#xff09;Server 第一个重要的子模块就是这个 Server 相关的模块。Server 代表服务的意思&#xff0c;其实就是这个 Nginx 的 HTTP 服务端所能提供的服务。或者更直白点说&#xff0c;就是虚拟主机的配置。通过 Server &…

SpringBoot操作Excel实现导入和导出功能(详细讲解+Gitee源码)

前言&#xff1a;在日常的开发中&#xff0c;避免不了操作Excel&#xff0c;比如从系统当中导出一个报表&#xff0c;或者通过解析客户上传的Excel文件进行批量解析数据入库等等&#xff0c;本篇博客主要汇总日常开发中如何使用开源的Apache提供的POI流操作Excel进行导入导出功…

el-dialog 层级问题混乱

使用 element -UI 的弹窗时&#xff0c;一般来说弹窗的层级应该比较高&#xff0c;背景置灰。 下边这个弹窗是正常情况下的&#xff1a; 有时候出现这样的情况&#xff1a; 解决问题&#xff1a; 只需要 在标签里边添加 append-to-body 属性问题就解决了。

WPF TextBox 添加范围验证

WPF TextBox 添加范围验证 添加范围验证&#xff0c;若出现范围错误添加信息捕捉 使用到技术&#xff1a;使用ValidationRules实现范围验证&#xff0c;当范围出现错误时&#xff0c;可以通过触发器Validation.HasErrorTrue设置自定义错误样式。 使用Behavior技术捕捉所有验证…

1-Nginx介绍及安装(源码安装)

1.Nginx介绍 Nginx&#xff08;engine x&#xff09;是一个轻量级、高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP服务器。 Nginx特点&#xff1a; ->占用内存少 ->并发能力强(3W/S) 2.Nginx安装 2.1.环境 [rootcentos79-3 ~]# cat /etc/redha…

未来网站开发必备:14个让你惊艳的JavaScript Web API!

微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录&#xff0c;有一线大厂面试完整考点、资料以及我的系列文章。 快来免费体验ChatGpt plus版本的&#xff0c;我们出的钱 体验地…

进制(数制)及进制之间的转换汇总(超详细)

进制是一种表示数字的方法&#xff0c;它决定了数字在数值系统中的位置和权值。常见的进制包括十进制、二进制、八进制和十六进制。 1. 十进制&#xff08;decimal&#xff09;&#xff1a; 十进制是我们日常生活中最常用的进制&#xff0c;使用0-9这10个数字来表示。每一位的…

小研报 - 神奇的 SD 图(InsCode Stable Diffusion 美图活动一期)

一、 Stable Diffusion 模型 在线使用地址&#xff1a;https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型版本及相关配置 Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 2391134711, Size: 512x512, Model hash: 74c61c3a52, Model: GuoFeng3, Version: v1.2…

【应用笔记】CW32 电容式触摸按键设计指南

前言 CW32 电容式触摸按键设计指南向客户提供一种利用 CW32 内部资源结合软件编程实现电容式触摸按键有效 触摸检测的方法。本指南的内容重点在于工作原理、软件检测过程以及调试指引。 利用芯源半导体的 CW32 系列小规模 MCU 的 IO、比较器、定时器、高速高精度内置 RC 时钟…