【Linux学习】进程间通信 (2) —— 信号

news2024/9/19 17:05:22

下面是有关进程通信中信号的相关介绍,希望对你有所帮助!

小海编程心语录-CSDN博客

目录

1. 信号 

1.1 概念 

1.2 信号的产生 

1.3 信号的处理方式 

2. 函数 

2.1 kill() 函数 

2.2 signal()函数 

2.3 sigaction()函数 

2.4 sigprocmask()函数 

2.5 sigqueue()函数 


1. 信号 

1.1 概念 

信号是进程间通信 UNIX IPC 中的其中一种通信方式,信号是事件发生时对进程的通知机制,也可以把它称为软件中断。大多数情况下,是无法预测信号达到的准确时间,所以,信号提供了一种处理异步事件的方法—— kill 命令查看所有信号。

ps -aux 指令可以看执行语句的pid等信息

1.2 信号的产生 

目的信号的目的是用来通信,当发生某种情况 下,通过信号将情况“告知”相应的进程,从而达到同步、通信的目的

信号由谁发出:

  1. 硬件发生异常,即硬件检测到错误条件并通知内核,随即再由内核发送相应的信号给相关进程。(异常包括执行一条异常的机器语言指令,诸如,除数为 0、数组访问越界导致引用了无法访问的内存区域等,这些异常情况都会被硬件检测到)
  2. 用于在终端下输入了能够产生信号的特殊字符。 譬如在终端上按下 CTRL + C 组合按键可以产生中断信号(SIGINT),通过这个方法可以终止在前台运行的进程
  3. 进程调用 kill()系统调用可将任意信号发送给另一个进程
  4. 用户可以通过 kill 命令将信号发送给其它进程,譬如在终端下执行"kill -9 xxx"来杀死 PID 为 xxx 的进程。 kill 命令其内部的实现原理便是通过 kill()系统调用来完成的。
  5. 发生了软件事件,即当检测到某种软件条件已经发生。(进程所设置的定时器 已经超时、进程执行的 CPU 时间超限、进程的某个子进程退出等等)

1.3 信号的处理方式 

当进程接收到内核或用户发送过来的信号之后,根据具体信号可以采取不同的处理方式:忽略信号、捕获信号或者执行系统默认操作。 Linux 系统提供了系统调用signal()和 sigaction()两个函数用于设置信号的处理方式

  1. 忽略信号:当信号到达进程后,该进程并不会去理会它、直接忽略,就好像是没有出现该 信号,信号对该进程不会产生任何影响。事实上,大多数信号都可以使用这种方式进行处理,但有 两种信号却决不能被忽略,它们是 SIGKILL 和SIGSTOP,因为它们 向内核和超级用户提供了使进程终止或停止的可靠方法
  2. 捕获信号:当信号到达进程后,执行预先绑定好的信号处理函数。Linux 系统提供了 signal()系统调用可用于注册信号的处理函数
  3. 执行系统默认操作:进程不对该信号事件作出处理,而是交由系统进行处理,每一种信号都会有其 对应的系统默认的处理方式,对大多数信号来说,系 统默认的处理方式就是终止该进程

 

2. 函数 

2.1 kill() 函数 

//函数原型
#include <sys/types.h>
#include <signal.h>

int kill(pid_t pid, int sig);

//pid:接收信号的进程PID,称为目标进程
//sig:信号的编号

2.2 signal()函数 

//函数原型
#include <signal.h>

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

/*
signum: 此参数指定需要进行设置的信号,可使用信号名或信号的数字编号

handler: sig_t 类型的函数指针,指定要关联的响应函数,也可以设 置为 SIG_IGN 或 SIG_DFL, SIG_IGN 表示此进程需要忽略该信号, SIG_DFL 则表示设置为系统默认操作

返回值: 此函数的返回值也是一个 sig_t 类型的函数指针,成功情况下的返回值则是指向在此之前的信 号处理函数;如果出错则返回 SIG_ERR,并会设置 errno。
*/

signal()函数是 Linux 系统下设置信号处理方式最简单的接口, 可将信号的 处理方式设置为捕获信号、 忽略信号以及系统默认操作

示例代码 

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

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

void sig_handler(int sig)
{
    printf("Received signal: %d\n", sig);
}

int main(int argc, char *argv[])
{
    sig_t ret = NULL;
    ret = signal(SIGINT, sig_handler);
    if (SIG_ERR == ret)
    {
        perror("signal error");
        exit(-1);
    }
    
    while(1)
    {

    }
    exit(0);
}

2.3 sigaction()函数 

//函数原型
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
/*
signum: 需要设置的信号,除了 SIGKILL 信号和 SIGSTOP 信号之外的任何信号。
act: act 参数是一个 struct sigaction 类型指针,指向一个 struct sigaction 数据结构,该数据结构描述了信
号的处理方式,如果参数 act 不为 NULL,则表示需要为信号设置新的处理方式;如
果参数 act 为 NULL,则表示无需改变信号当前的处理方式。
oldact: oldact 参数也是一个 struct sigaction 类型指针,指向一个 struct sigaction 数据结构。如果参数
oldact 不为 NULL, 则会将信号之前的处理方式等信息通过参数 oldact 返回出来;如果无意获取此类信息,
那么可将该参数设置为 NULL。
返回值: 成功返回 0;失败将返回-1,并设置 errno
*/

除了signal()之外, sigaction()系统调用是设置信号处理方式的另一选择,虽然sigaction()更为复杂,但 sigaction()更具灵活性以及移植性。

sigaction()允许单独获取信号的处理函数而不是设置,并且还可以设置各种属性对调用信号处理函数时 的行为施以更加精准的控制

2.4 sigprocmask()函数 

 内核为每一个进程维护了一个信号掩码,当进程接收到一个属于 信号掩码中定义的信号时,该信号将会被阻塞、无法传递给进程进行处理。

//函数原型
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

函数参数和返回值含义如下:

  1. how: 参数 how 指定了调用函数时的一些行为。
  2. set: 将参数 set 指向的信号集内的所有信号添加到信号掩码中或者从信号掩码中移除;如果参数 set 为 NULL,则表示无需对当前信号掩码作出改动。
  3. oldset: 如果参数 oldset 不为 NULL,在向信号掩码中添加新的信号之前,获取到进程当前的信号掩码, 存放在 oldset 所指定的信号集中;如果为 NULL 则表示不获取当前的信号掩码
  4. 返回值: 成功返回 0;失败将返回-1,并设置 errno

示例代码 

实现对SIGINT信号的屏蔽

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

static void sig_handler(int sig)
{
    printf("Received signal: %d\n", sig);
}
int main(void)
{
    struct sigaction sig = {0};
    sigset_t sig_set;
    // 注册信号处理函数 
    sig.sa_handler = sig_handler;
    sig.sa_flags = 0;

    if (-1 == sigaction(SIGINT, &sig, NULL))
        exit(-1);

    // 信号集初始化 
    sigemptyset(&sig_set);
    //添加SIGINT信号
    sigaddset(&sig_set, SIGINT);

    // 向信号掩码中添加信号 
    if (-1 == sigprocmask(SIG_BLOCK, &sig_set, NULL))
        exit(-1);

    printf("正在休眠,此时对SIGINT信号屏蔽\n");
    sleep(5);
    printf("休眠结束\n");
    // 从信号掩码中移除添加的信号 
    if (-1 == sigprocmask(SIG_UNBLOCK, &sig_set, NULL))
        exit(-1);

    while(1)
    {

    }
    exit(0);
}

2.5 sigqueue()函数 

该函数的功能与kill一样,都是向指定进程发送信号,但sigqueue在发送信号的同时会携带很多额外信息。

//函数原型
#include <signal.h>

int sigqueue(pid_t pid, int sig, const union sigval value);

函数参数和返回值含义如下:

  1. pid: 指定接收信号的进程对应的 pid,将信号发送给该进程
  2. sig: 指定需要发送的信号
  3. value: 参数 value 指定了信号的伴随数据, union sigval 数据类型
  4. 返回值: 成功将返回 0;失败将返回-1,并设置 errno

如果喜欢请不吝给予三连支持!

小海编程心语录-CSDN博客

 

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

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

相关文章

自定义函数python:深入解析与实操

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;函数的命名与规范 二、函数命名&#xff1a;遵循规范&#xff0c;易于…

Python计算回归拟合各项指标

0、各项回归指标简介 Relative Root Mean Squared Error&#xff08;RRMSE&#xff09;&#xff1a;The RRMSE normalizes the Root Mean Squared Error (RMSE) by the mean of observations. It goes from 0 to infinity. The lower the better the prediction performance.T…

“AI黏土人”一夜爆火,图像生成类应用应该如何长期留住用户?

文章目录 最近大火的“AI黏土人”&#xff0c;一股浓浓的《小羊肖恩》风。 凭借这这种搞怪的风格&#xff0c;“AI黏土人”等图像生成类应用凭借其创新技术和市场需求迅速崛起并获得巨大关注。然而&#xff0c;要保持用户黏性并确保长期发展&#xff0c;这些应用需要采取一系列…

Spring常用注解(超全面)

官网&#xff1a;核心技术SPRINGDOC.CN 提供 Spring 官方文档的翻译服务&#xff0c;可以方便您快速阅读中文版官方文档。https://springdoc.cn/spring/core.html#beans-standard-annotations 1&#xff0c;包扫描组件标注注解 Component&#xff1a;泛指各种组件 Controller、…

第53期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

Leecode热题100---46:全排列(递归)

题目&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 思路&#xff1a; 元素交换函数递归&#xff1a; 通过交换元素来实现全排列。即对于[x, nums.size()]中的元素&#xff0c;for循环遍历每个元素分别成…

streamlit 学习

表情网站 https://getemoji.com/ 官网&#xff1a; https://streamlit.io/ 文档 https://docs.streamlit.io/develop/api-reference/chat/st.chat_message 安装&#xff1a; pip install streamlit启动 以下的python 文件指写streamlit 程序的脚步。 1、先切换目录到Pyth…

回溯算法之简单组合

哦吼&#xff01;今天结束了二叉树&#xff0c;开始回溯算法 其实也需要用到迭代&#xff0c;哈哈哈哈&#xff0c;但是这个暴力穷举真的好爽。 先记一下回溯算法的基本框架吧 老规矩&#xff1a; 还是有结束条件 但是后面就不太一样了 这里就是for循环&#xff0c;循环n…

2024年中国金融行业网络安全案例集

随着科技的飞速发展,金融行业与信息技术的融合日益加深,网络安全已成为金融行业发展的生命线。金融行业作为国家经济的核心支柱&#xff0c;正在面临着日益复杂严峻的网络安全挑战。因此&#xff0c;深入研究和探讨金融行业的网络安全问题&#xff0c;不仅关乎金融行业的稳健运…

聚数力 以数兴 | 与“闽”同行,共话数字未来

闽江之畔&#xff0c;数智腾飞。5月24日&#xff0c;第七届数字中国建设峰会在海峡国际会展中心盛大举办。本届展会的主题是“释放数据要素价值&#xff0c;发展新质生产力”&#xff0c;由国家发展改革委、国家数据局、福建省人民政府等单位共同主办&#xff0c;福州市人民政府…

【电路笔记】-状态可变滤波器

状态可变滤波器 文章目录 状态可变滤波器1、概述2、**状态可变滤波器电路**3、状态可变滤波器示例4、陷波滤波器设计5、总结状态可变滤波器是一种多反馈滤波器电路,可以从同一单个有源滤波器设计中同时产生所有三种滤波器响应:低通、高通和带通。 1、概述 状态可变滤波器使用…

你也许不知道,自己可能是一个热人

今天想跟大家分享的&#xff0c;是一种很少有人了解的人格特质。它非常普遍&#xff0c;许多人都或多或少有一些倾向&#xff0c;但却很少有人意识到它。 不妨看一看&#xff0c;你有没有下面这些特征&#xff1a; 有着极其旺盛的求知欲&#xff0c;对许多奇奇怪怪的问题都有着…

工厂电子看板显示屏让生产信息推送更便捷

在当今竞争激烈的制造业领域&#xff0c;高效的生产管理至关重要。而工厂电子看板显示屏作为一种先进的信息展示工具&#xff0c;正逐渐成为工厂提升生产效率和管理水平的得力助手。 一、工厂电子看板配备了统一的管理后台 这一创新设计带来了极大的便利。通过电子看板后台&am…

GEE27:遥感数据可用数据源计算及条带号制作

1.写在前面 &#x1f30d;✨今天读了一篇关于遥感数据可用数据源计算及条带号制作的文章&#xff0c;结合着自己的理解&#xff0c;添加了一些内容。 2.GEE代码 &#x1f4da;&#x1f4da;这段代码的主要作用是利用Google Earth Engine平台&#xff0c;通过分析Landsat 8影…

【贪心算法指针】C++ 解决子数组 / 子序列的相关问题(最大数、数组和减半的最小操作数、连续/递增序列)

文章目录 1. 前言1.1 贪心算法介绍 2. 算法题2.1_将数组和减半的最少操作次数2.2_最大数2.3_最长递增子序列2.4_递增的三元子序列2.5_最长连续递增序列2.6_数组中的最长连续子序列2.7_在字符串中找出连续最长的数字串 1. 前言 1.1 贪心算法介绍 贪心算法&#xff08;Greedy A…

民国漫画杂志《时代漫画》第27期.PDF

时代漫画27.PDF: https://url03.ctfile.com/f/1779803-1248635258-b6a842?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

Thingsboard规则链:Message Type Filter节点详解

一、Message Type Filter节点概述 二、具体作用 三、使用教程 四、源码浅析 五、应用场景与案例 智能家居自动化 工业设备监控 智慧城市基础设施管理 六、结语 在物联网&#xff08;IoT&#xff09;领域&#xff0c;数据处理与自动化流程的实现是构建智能系统的关键。作…

我的创作纪念日——我与CSDN一起走过的128天

目录 一、机缘&#xff1a;旅程的开始 二、收获&#xff1a;沿路的花朵 三、日常&#xff1a;不断前行中 四、成就&#xff1a;一点小确幸 五、憧憬&#xff1a;梦中的重点 一、机缘&#xff1a;旅程的开始 最开始开始写博客是在今年一二月份的时候&#xff0c;也就是寒假…

(2024,DDDM,ODE,少量步生成,迭代生成)直接去噪扩散模型

Directly Denoising Diffusion Model 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 直接去噪扩散模型 3.1. 迭代求解 4. Psuedo-LPIPS 指标 5. 实验 7. 讨论和局限性 0. 摘…

HTTP方法、状态码和请求过程

一、HTTP方法概念&#xff1a; HTTP客户端发出请求&#xff0c;告知服务端需要执行不同类型的请求命令&#xff0c;这些命令被称为HTTP方法。 简说:HTTP方法是告诉服务器要做什么。 1、GET方法&#xff1a;获取资源 作用&#xff1a; ①通常用于请求服务器发送某个资源&am…