linux_信号_sigqueue函数发送信号传参_sigaction函数捕捉信号传参_中断系统调用

news/2024/9/7 9:41:14/

接上一篇:linux_SIGCHLD信号-子进程回收

  本次来分享怎样通过信号传参,也是对sigqueue函数的调用,同时也来分享学习中断系统调用的知识,开始上菜:

此博主在CSDN发布的文章目录:【我的CSDN目录,作为博主在CSDN上发布的文章类型导读】

目录

  • 1.信号传参
    • 1.1.发送信号传参
    • 1.2.捕捉函数传参-sigaction函数
  • 2.中断系统调用

1.信号传参

1.1.发送信号传参

函数作用:
  对应kill函数,但可在向指定进程发送信号的同时携带参数
头文件:
  #include <signal.h>
函数原型:
  int sigqueue(pid_t pid, int sig, const union sigval value);
函数参数:
  pid:进程ID
  sig:需要发送的信号
  value:需要携带的数据
    union sigval {
       int sival_int;
       void *sival_ptr;
       };
返回值:
  成功:0;
  失败:-1,设置errno

  向指定进程发送指定信号的同时,携带数据。但,如传地址,需注意,不同进程之间虚拟地址空间各自独立,将当前进程地址传递给另一进程没有实际意义。

1.2.捕捉函数传参-sigaction函数

函数作用:
  修改信号处理动作(通常在Linux用其来注册一个信号的捕捉函数)。
头文件:
  #include <signal.h>
函数原型:
   int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
函数参数:
  signum:需要修改默认处理动作的信号
  act:传入参数,新的处理方式。
  oldact:传出参数,旧的处理方式。
返回值:
  成功:0;
  失败:-1,设置errno

  当注册信号捕捉函数,希望获取更多信号相关信息,不应使用sa_handler而应该使用sa_sigaction。但此时的sa_flags必须指定为SA_SIGINFO。siginfo_t是一个成员十分丰富的结构体类型,可以携带各种与信号相关的数据。

例子:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
//回调函数
void func(int signo, siginfo_t *uinfo, void *val)
{printf("-----------signo is = %d\n", uinfo->si_signo);printf("-----------send pid = %u\n", uinfo->si_pid);printf("-----------sender's value is %d\n", uinfo->si_value);return ;
}int main(void)
{pid_t pid = fork();union sigval uval;uval.sival_int = 887;if (pid > 0) //父进程{   sleep(1);sigqueue(pid, SIGUSR1, uval);   //kill 给子进程发信号 ,同时携带数据wait(NULL);} else if (pid == 0) {int n = 5;struct sigaction act;act.sa_sigaction = func;sigemptyset(&act.sa_mask);act.sa_flags = SA_SIGINFO;    //同sa_flags = 0;sigaction(SIGUSR1, &act, NULL);//注册信号捕捉函数while (n--) 
{printf("I'm child pid = %d\n", getpid());sleep(1);}}return 0;
}

2.中断系统调用

系统调用可分为两类:慢速系统调用和其他系统调用。
  1.慢速系统调用: 可能会使进程永远阻塞的一类。如果在阻塞期间收到一个信号,该系统调用就被中断,不再继续执行(早期);也可以设定系统调用是否重启。如,read、write、pause、wait…
  2.其他系统调用: getpid、getppid、fork…
结合pause,回顾慢速系统调用:
   慢速系统调用被中断的相关行为,实际上就是pause的行为: 如,read
     ① 想中断pause,信号不能被屏蔽。
     ② 信号的处理方式必须是捕捉 (默认、忽略都不可以)
     ③ 中断后返回-1, 设置errno为EINTR(表“被信号中断”)
  可修改sa_flags参数来设置被信号中断后系统调用是否重启。SA_INTERRURT不重启。 SA_RESTART重启。
扩展了解:
   sa_flags还有很多可选参数,适用于不同情况。如:捕捉到信号后,在执行捕捉函数期间,不希望自动阻塞该信号,可将sa_flags设置为SA_NODEFER,除非sa_mask中包含该信号。

以上就是本次的分享了,希望能对广大网友有所帮助。


http://www.ppmy.cn/news/51317.html

相关文章

43岁程序员,投了上万份简历都已读不回,只好把年龄改成40岁,这才有了面试机会,拿到了offer!...

40多岁找工作有多难&#xff1f; 一位43岁的程序员讲述了自己找工作的经历&#xff1a; 80年&#xff0c;大专&#xff0c;目前没到43周岁&#xff0c;年前被裁&#xff0c;简历上的年龄是42岁&#xff0c;两个多月投了上万份简历&#xff0c;99.5%是已读未回。后来改变策略把简…

【MySQL】单表查询

一、表的准备 查询操作的SQL演示将基于下面这四张表进行&#xff0c;我们先创建好这四张数据表&#xff0c;并为其添加数据。 1、第一张表为部门表&#xff0c;名称为包含三个字段&#xff1a;部门编号&#xff08;deptno&#xff09;&#xff0c;部门名称&#xff08;dname&…

java学习中遇到的问题及解答

你好&#xff0c;我想问一下&#xff0c;为什么在idea编译环境下&#xff0c;有异常的地方它会报错&#xff0c;让你主动添加抛出错误代码呢&#xff1f; 在Java中&#xff0c;有两种类型的异常&#xff0c;一种是受检异常&#xff08;checked exception&#xff09;&#xff0…

计及调度经济性的光热电站储热容量配置方法【IEEE30节点】(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

Java BIO

1.Java BIO(Blocking IO:同步并阻塞式IO)编程 1.1.基本介绍 1>.Java BIO就是传统的java io编程,其相关的类和接口在"java.io"包下; 2>.BIO(Blocking I/O): 同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处…

IGS 产品长文件命名方式简介

文章目录 Part.I IntroductionPart.II 文件命名方式 V1.0Chap.I 官方说明Chap.II 实例 Part.III 文件命名方式 V2.0Chap.I 官方说明Chap.II 实例 Reference Part.I Introduction 2022 年 11 月 30 日&#xff08;DOY 331, GPSWD 22380&#xff09;及以后&#xff0c;IGS 的参…

ArcGIS Pro用户界面

目录 1 功能区 1.1 快速访问工具栏 1.2 自定义快速访问工具栏 1.3 自定义功能区选项 1.3.1 添加组和命令 1.3.2 添加新选项卡 2 视图 3 用户界面排列 ​编辑 4 窗格 4.1 内容窗格 4.2 目录窗格 4.3 目录视图&#xff08;类似ArcCatalog&#xff09; 4.4 浏览对话框…

redis部署过程中的一些记录内容

修改redis的配置文件&#xff1a;redis.conf 修改bind参数&#xff0c;将其置为0.0.0.0以便可以从外部访问Redis服务。修改requirepass参数&#xff0c;设置密码保护Redis服务&#xff0c;确保只有授权用户才能访问。修改maxmemory参数&#xff0c;限制Redis使用的内存大小&am…

Vue - 实现垂直菜单分类栏目,鼠标移入后右侧出现悬浮二级菜单容器效果(完整示例源码,详细代码注释,一键复制开箱即用)

前言 网上的教程都太乱了,各种杂乱无注释代码、图片资源丢失、一堆样式代码,根本无法改造后应用到自己的项目中。 本文实现了 在 Vue / Nuxt 项目中,垂直分类菜单项,当用户鼠标移入菜单后,右侧自动出现二级分类悬浮容器盒子效果, 您可以直接复制源码,然后按照您的需求再…

SQL综合查询下

SQL综合查询下 目录 SQL综合查询下18、查询所有人都选修了的课程号与课程名题目代码题解 19、SQL查询&#xff1a;查询没有参加选课的学生。题目代码 20、SQL查询&#xff1a;统计各门课程选修人数&#xff0c;要求输出课程代号&#xff0c;课程名&#xff0c;有成绩人数&#…

《程序员面试金典(第6版)》面试题 16.02. 单词频率(哈希法,C++)

题目描述 设计一个方法&#xff0c;找出任意指定单词在一本书中的出现频率。 你的实现应该支持如下操作&#xff1a; WordsFrequency(book)构造函数&#xff0c;参数为字符串数组构成的一本书get(word)查询指定单词在书中出现的频率 示例&#xff1a; WordsFrequency word…

Nextjs 处理 css3 前缀兼容

Nextjs 处理 css3 前缀兼容 虽然css3现在浏览器支持率已经很高了, 但有时候需要兼容一些低版本浏览器,需要给css3加前缀,可以借助插件来自动加前缀, postcss-loader就是来给css3加浏览器前缀的,安装依赖&#xff1a; npm i postcss-loader autoprefixer -Dpostcss-loader&…

Java基础(十九):集合框架

Java基础系列文章 Java基础(一)&#xff1a;语言概述 Java基础(二)&#xff1a;原码、反码、补码及进制之间的运算 Java基础(三)&#xff1a;数据类型与进制 Java基础(四)&#xff1a;逻辑运算符和位运算符 Java基础(五)&#xff1a;流程控制语句 Java基础(六)&#xff1…

数组地址3个题

向一个长度为n的向量的第i个元素(1≤i≤n1)之前插入一个元素时&#xff0c;需向后移动 () 个元素。 向一个长度为n的向量的第i个元素(1≤i≤n1)之前插入一个元素时&#xff0c;需要向后移动&#xff08;n-i1&#xff09;个元素 从第 i 个元素开始&#xff0c;包括第 i 个元素…

http header的kv存储

HTTP Header 是指在 HTTP 请求和响应中的头部信息&#xff0c;用于描述请求或响应的属性、特征和约束条件等。HTTP Header 的格式通常是“键-值”对&#xff08;Key-Value Pair&#xff0c;简称 KV 对&#xff09;&#xff0c;即由一个字段名和一个对应的值组成&#xff0c;两者…

数组应该怎么用?

文章目录 前言一、数组是什么&#xff1f;二、数组的创建1.数组的创建&#xff1a;2.数组的初始化 三.数组的遍历1.逐个打印2.使用for循环四.二维数组1.语法&#xff1a;2.遍历 五.数组的一些常用方法1.数组转换字符串2.数组拷贝3.二分查找4.冒泡排序5.数组逆序 总结 前言 为什…

基于JAVA CS远程监控系统软件的实现

基于JAVA C/S远程监控系统软件的实现 摘 要 近年来,网络技术的不断发展,为远程监控技术的发展创造了条件。远程监控系统软件越来越受到人们的重视,其实用性也毋庸质疑。基于JAVA C/S远程监控系统软件突破了空间的限制,使用者不用亲临,在自己的电脑面前就能轻松的实现对被…

JS数组slice splice 字符串 slice substring substr区别

数组&#xff1a; slice()&#xff1a;数组截取&#xff0c;从第一个下标开始截取到第二个下标&#xff0c;不包括第二个下标; 一个值&#xff1a;slice(0)&#xff1a;从下标0截取到最后&#xff1b; 两个值&#xff1a;slice(0,3)&#xff1a;从下标0截取到下标3&#xff…

如何快速删除PDF中的一个/多个页面

创建 PDF 后&#xff0c;您将无法更改它。但是&#xff0c;有时您必须从 PDF 中删除页面以保护隐私内容。因此&#xff0c;我们将向您展示几种在桌面或在线上实现它的方法。 第 1 部分&#xff1a;在桌面上从 PDF 中删除页面的最佳方式 桌面软件是从 PDF 中删除页面的最佳方式…

把一个长方形平均分为4份,我想了几十种方法,不服来挑战

这是学习笔记的第 2455篇文章 这个事情的源头是在前几天哄孩子睡觉前&#xff0c;我和她聊分数的事情&#xff0c;一般为了便于理解我会拿披萨来举例&#xff0c;比如把一个披萨分成2份&#xff0c;分成3份&#xff0c;分成4份等&#xff0c;似乎顺着圆心我们可以想到既定的方案…