Linux 信号(三) —— 强大的sigaction

2023-10-27

在Linux中,对于信号的收发有着两组函数

1、入门版

        发送函数:int kill(pid_t pid, int sig);

        接收函数:sighandler_t signal(int signum, sighandler_t handler);

这组函数在之前的文章中已有讲解

2、高级版

        发送函数:  int sigqueue(pid_t pid, int sig, const union sigval value);

        接收函数:  int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

一、入门版与高级版的区别

        入门版的函数只能发送哪种信号,并不能在发送信号的同时把我们关心的一些数据也一同发过去,这就有点类似于,别人在门口敲门却一直不说话,就一个劲的在那里敲,这样是不是显得有点鸡肋,这就使得入门版的函数只能适用于一些简单的情景下。

        而高级版除了具备入门版的功能外,还能连同数据一起发送、设置信号是否阻塞,当信号中断了进程的某个系统调用,系统是否自动启动该系统调用。 比如:需要你输入一些数据(scanf),但是这时进来了个信号被中断了,如果设置了系统能自动启动该系统调用,则执行完信号处理函数时会继续执行之前的scanf。

二、详解高级版函数

 1、 发送函数 : int sigqueue(pid_t pid, int sig, const union sigval value);

        pid : 目标进程号

        sig : 发送的信号类型

        value : 要发送的数据,联合体

union sigval {
               int   sival_int;           // 整数 
               void *sival_ptr;        // 字符串
          };

 2、接收函数:  int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

#include <signal.h>

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

struct sigaction {

                         void       (*sa_handler)(int);        //信号处理程序,不接受额外数据,SIG_IGN 为 忽 略,SIG_DFL 为默认动作,(这个实际上就是入门版的handler函数)        

                         void       (*sa_sigaction)(int, siginfo_t *, void *);         //信号处理程序,能够接受额外数据和sigqueue配合使用  (在高级版中,主要是用这个 ),第三个参数好像暂时来说没什么作用。

                        sigset_t   sa_mask;        // 阻塞关键字的信号集

                        int        sa_flags;        //影响信号的行为SA_SIGINFO表示能够接受数据 ,SA_RESTART表示能够自启动,当然还有其他类型的标志

 };

//回调函数句柄sa_handler、sa_sigaction只能任选其一

mask默认情况下是阻塞的作用,即在处理一个信号时,如果还有其他信号到来,就让刚来的信号等待。

收到的数据、发送端的信息等都存放在下面这个结构体中

 代码示例:

接收端:

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

void handler(int sig,siginfo_t *info, void *context)
{
        printf("signal = %d\n",sig);

        printf("get the data is %d\n",info->si_int);  // 打印接收到的数据
        printf("get the data is %d\n",info->si_value.sival_int); // 打印接收到的数据
        /*
            printf("get the data is %s\n",(char *)info->si_value.sival_ptr);
            
            字符串的接收发需要用到共享内存,或者在同一进程内
            
        */
        printf("from the pid is %d\n",info->si_pid);  // 打印发送端的进程号

}

int main()
{
//       int sigaction(int signum, const struct sigaction *act,
//                     struct sigaction *oldact);
        char buf[10] ={0};

        struct sigaction act;
        act.sa_sigaction = handler;
        sigaddset(&act.sa_mask, 15);   // 15号信号加入到阻塞中
        //act.sa_flags = SA_RESTART;
        act.sa_flags = SA_SIGINFO | SA_RESTART;   // 能过接受数据和自启动

        sigaction(2,&act,NULL);
        sigaction(15,&act,NULL);

        printf("input: ");
        scanf("%s",buf);
        printf("buf is %s\n",buf);

        return 0;
}

                                                     

 发送端:

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

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

int main(int argc, char **argv)
{
        if(argc != 3){
                printf("parameter error!\n");
                exit(0);
        }

        pid_t pid = atoi(argv[2]);   // 字符串转换成数字
        int signum = atoi(argv[1]);

        union sigval value1;
        value1.sival_int = 100;       // 发送的数据为 整数100
        sigqueue(pid,signum,value1);
        printf("the pid is %d\n",getpid());

        return 0;
}                                

(多敲多练)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 信号(三) —— 强大的sigaction 的相关文章

  • 深入理解Vue双向数据绑定

    MVVM Vue的双向数据绑定是指model 模型 也就是vue实例中的数据 和view 视图 的双向绑定 即一个发生改变 另一个也会改变 首先了解一下什么是MVVM model view viewmodel 在 MVVM 架构中 引入了
  • selenium webdriver webelement获取标签方法

    1 等待浏览器加载完指定的标签 from selenium webdriver support wait import WebDriverWait from selenium webdriver support import expecte
  • 使用C++中用OLEDB读dbf文件,报“外部表不是预期的格式”错误的处理

    使用C builder的ADO控件访问dbf文件 执行SQL时报错 我的connect连接字符串 con1 gt ConnectionString Provider Microsoft Jet OLEDB 4 0 Data Source s
  • python 基于GPS空间相似度的K-means轨迹聚类

    python 基于空间相似度的K means轨迹聚类 数据读取 定义不同轨迹间的距离 计算距离矩阵 k means聚类 这里分享一些轨迹聚类的基本方法 涉及轨迹距离的定义 kmeans聚类应用 需要使用的python库如下 import p
  • Node事件循环

    node事件循环和浏览器事件循环完全不一样 Node事件循环阶段 timers 定时器 此阶段执行setTimeout和setInterval调度的回调函数 I O callback I O回调 此阶段执行几乎所有的回调函数 除了close
  • C语言---栈(详解)---数据结构

    如果要拿数据要先拿最上面的 不允许跳过第一个 拿第二个 先重定义类型 意义前几篇都要讲 就不再赘述 实现栈要用到的头文件 结构体 top是记录栈中现有多少个数据 并且top一直处于栈顶 capacity就是容量大小 如果大于容量大小 那么我
  • 企业电子招标采购系统源码Spring Cloud + Spring Boot + MybatisPlus + Redis + Layui + 前后端分离 + 二次开发

    功能描述 1 门户管理 所有用户可在门户页面查看所有的公告信息及相关的通知信息 主要板块包含 招标公告 非招标公告 系统通知 政策法规 2 立项管理 企业用户可对需要采购的项目进行立项申请 并提交审批 查看所有的立项信息 主要功能包含 招标
  • 最强自动化测试框架Playwright(34)CDPSession

    在 Playwright 中 CDPSession 类是用于与浏览器的 Chrome DevTools Protocol CDP 会话进行交互的对象 CDP 是与Chromium浏览器通信的底层协议 它提供了许多与浏览器进行交互和控制的功能
  • 电动机三相绕组的星形接线法和三角形接线法

    三相异步电动机的定子绕组由U V W三相绕组组成 这三相绕组有6个接线端 它们与接线盒的6个接线柱连接 在接线盒上 可以通过将不同的接线柱短接 来将三相异步电动机定子绕组接成星形或三角形 图1 三相异步电动机接线盒 1 星形接线法 要将定子
  • FutureTask源码解析(详细)

    FutureTask源码解析 详细 首先futuretask实现了Runablefuture接口 此接口声明了run方法 而Runablefuture接口继承了runable和future接口 future接口定义了某些方法比如get获取结
  • listener模式

    监听者模式 一个listenerCenter 每个listener 对不同的传入参数做不同的事情 把这些listener加入Center列表 然后Center执行做什么事情 调用响应的listener执行事情 我只需要让center 广播消
  • 『学Vue2+Vue3』生命周期、工程化开发入门、综合案例-小兔仙首页

    day03 一 今日目标 1 生命周期 生命周期介绍 生命周期的四个阶段 生命周期钩子 声明周期案例 2 综合案例 小黑记账清单 列表渲染 添加 删除 饼图渲染 3 工程化开发入门 工程化开发和脚手架 项目运行流程 组件化 组件注册 4 综
  • 蓝牙Mesh协议三 设备配网

    前言 蓝牙Mesh配网就是通过配网器配置未配网设备 将未配网设备加入网络中 使其成为蓝牙mesh网络的节点 配网数据中包括分发网络密钥 network key 元素单播地址 unicast address 和IV Index 为了提高配网效
  • nmap基础使用

    nmap Nmap包含四项基本功能 主机发现 Host Discovery 端口扫描 Port Scanning 版本侦测 Version Detection 操作系统侦测 Operating System Detection 而这四项功能
  • el-form表单中el-form-item嵌套表格嵌套表单校验

  • spss对数据进行聚类分析(系统聚类法和k-均值聚类法)和判别分析(费歇尔和贝叶斯)。

    为了方便大家理解 以三道题为例 实现聚类分析和判别分析的演示 1 为了研究世界各国森林 草原资源的分布规律 共抽取了21个国家的数据 每个国家4项指标 原始数据见下表 试用该原始数据对国别进行系统聚类和K 均值聚类 分3类 分析 国别 森林
  • 文章发布系统的设计与实现

    摘 要 随着计算机技术的迅速发展 网络正以一种前所未有的冲击力影响着人类的生产和生活 网络的快速发展 颠覆了传统的信息传播方式 冲破了传统的时间 空间的局限性 继而引发了人类阅读方式的变革 现如今 网络阅读已成为一种新的时尚 在这种趋势下

随机推荐

  • ESP8266 WIFI模块实现远程wifi控制

    http www geek workshop com thread 11266 1 1 html http bbs elecfans com forum php mod viewthread tid 536464 http www extr
  • Ubuntu18.04.6 配置固定ip、ssh登录、root账号

    上文讲解了如何下载安装ubuntu https blog csdn net weixin 47491957 article details 128839639 ubuntu在安装完成后 是不能进行ssh登录 且没有root账号 本文带来如何
  • 深入剖析 Python 最常用数据结构:列表(List) & 元组(Tuple)

    1 定义 列表和元组 都是一个可以放置任意数据类型的有序集合 在大多数编程语言中 集合内元素的数据类型必须保持一致 但在 Python 的列表与元组中 没有这个约束 示例 列表 List Tom 22 33 tony 元组 Tuple Ch
  • 网易新闻的api

    一些新闻的api 一 网易 http c m 163 com nc article headline T1348647853363 0 40 html 头条 http c 3g 163 com nc article list T146728
  • 浏览器网页被劫持

    你是否遇到过网页被劫持 正常打开却发现 这种情况能容忍吗 能忍但是没必要 首先打开浏览器网页被劫持不要慌 浏览器右键打开属性 你会发现目标 后面 这里多了一个网址 把它干掉你会发现 大无语事件发生了 好家伙 想直接干掉这个还没权限 右键属性
  • 桌面图标有蓝色阴影终极解决方法

    桌面图标有蓝色阴影 桌面图标背景出现蓝色阴影是怎么回事呢 通常情况下桌面图标变成蓝色背景是由于一些错误的设置而导致的 虽然它不影响系统的正常运行 但是看起来总是不舒服的 网上也有很多处理桌面图标背景出现蓝色阴影的方法 但大都不太全面 引起这
  • Android 手机影音 开发过程记录(四)

    前一篇已经将视频播放页面的布局弄好了 这一篇主要来处理播放页面的各种逻辑 播放 暂停 上 下一个视频 音量 进度 逻辑比较多 一点一点贴代码 顶部布局的逻辑 显示系统时间 时间是一秒一秒更新的 所以可以通过循环发消息的方法来更新系统时间 相
  • 离散对数密码学原理

    一 简介 离散对数被誉为当代密码学领域的三大基础之一 1976年 Diffifie和Hellman提出了一种密钥协商协议 产生了首个离散对数系统模型 8年后 ElGamal提出了基于离散对数系统的公钥加密和签名方法 并奠定了离散对数密码学基
  • 解决Visual Studio 2017启动后不显示窗体

    今晚启动VS等了很久都没有显示窗体 电脑也没有卡死的迹象 只是在任务栏里显示了图标 试了很多常规操作 检查兼容性的时候发现一个叫devenv exe的程序似乎是导致这个问题的原因 有趣的是我在Windows上看到了有人提交了这个问题 有的人
  • apache配置双向ssl认证(笔记)

    一 CA自签 Linux下先安装openssl 安装路径于 usr local openssl 1 修改openssl配置文件 etc pki tls openssl cnf 设置好 dir usr local openssl ssl mi
  • 随笔之---基于信号量实现,生产者与消费者模型

    Class BoundedBuffer mutex new Semaphore 1 hasBuffer new Semaphore n 有n个空buffer 用来装数据 hasData new Semaphore 0 记录有数据的buffe
  • Java导出压缩包zip文件

    需要导出一些图片和一个文本 一起放到zip压缩包中 GetMapping downloadZip public void downloadZip HttpServletResponse response throws IOException
  • 解决ffmpeg视频转码后视频清晰度下降的问题

    清晰度 Chrome不支持非h264编码的mp4视频播放 可通过ffmpeg将视频转码成h264编码 ffmpeg i input mp4 vcodec h264 b v 0 output mp4 注 如果不加参数 b v 0 会有精度损失
  • Flutter Text控件在不同手机上不居中的问题

    在最近flutter页面改造过程中 发现通过Contail包裹Text控件设置上下padding时 在华为魅族和vivo等手机上并没有居中展示 所以通过查看控件属性 得以解决此类问题 可以看到上面的在华为手机上明显偏下了 使用 Contai
  • 找出一批正整数中的最大偶数_c语言求一批正整数的奇数和-求奇数和输入一批正整数c语言程序-找出一批正整数中最大的偶数c语言...

    include stdio h int main int a 10 i j k printf 输入10个整数 n for i k 0 i lt 10 i scanf d a k for j 0 j if a k a j k k printf
  • [疯狂Java]面向对象:单例模式

    1 单例模式的应用 1 单例类就是指该类最多只能创建一个对象 不能创建超过一个的对象 2 这样做的原因 要么就是为了降低系统开销 要么这种类型的对象创建了多个没有任何意义 最多只需要一个就行 例如窗口管理器 假脱机打印设备 数据库引擎访问结
  • TCP传输过程详解——三次握手、四次挥手

    TCP 3 1 三次握手 重点 3 2 四次挥手 重点 3 3 通过序列号与确认应答提高可靠性 3 4 重发超时的确定 3 5 以段为单位发送数据 3 6 利用窗口控制提高速度 3 7 滑动窗口控制 3 8 窗口控制中的重发控制 TCP T
  • ICCV19 (Oral)

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 本文作者 洪晓鹏 https zhuanlan zhihu com p 127956794 本文已由原作者授权 不得擅自二次转载 Zhiheng Ma Xing Wei
  • 苹果发布iOS16正式版,各机型升级建议

    文章目录 前言 升级注意事项 iOS 16增加了哪些功能 1 锁屏界面大改动 2 全新专注模式 3 查看Wi Fi密码 4面容ID横屏解锁 5 电量百分比 6 支持任天堂Switch手柄 7 键盘输入震动 8 隐藏相册支持加密 9 清理重复
  • Linux 信号(三) —— 强大的sigaction

    在Linux中 对于信号的收发有着两组函数 1 入门版 发送函数 int kill pid t pid int sig 接收函数 sighandler t signal int signum sighandler t handler 这组函