当前位置: 首页 > news >正文

第五部分:7---信号的捕捉

目录

信号递达期间,该信号会被屏蔽直到递达完成。

sigaction实现信号的捕捉:

案例:在处理2号信号时屏蔽3号信号。

子进程退出向父进程发送SIGCHLD信号:


信号递达期间,该信号会被屏蔽直到递达完成。

  • 当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字block中,当信号处理函数返回时自动恢复原来的信号屏蔽字。

  • 这样就保证了在处理某个信号时,如果这种信号再次产生,那么 它会被阻塞到当前处理结束为止。

  • 如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。

sigaction实现信号的捕捉:

  • sigaction接口的功能类似于signal接口,但是在捕捉信号后,信号自定义函数的执行过程中,可以设置sa_mask字段来屏蔽一些其他的信号。防止同时处理这些信号

#include <signal.h>
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
//act表示自定义处理函数
//oldact,返回型参数,记录修改前的处理函数的地址

案例:在处理2号信号时屏蔽3号信号。

  • 通过设置struct sigaction 的 sigset_t sa_mask;成员,来达到上述目的。

  • 下面代码可以实现:在处理2号信号期间阻塞3号信号。

#include<iostream>
#include<unistd.h>
#include<signal.h>
using namespace std;
void handle(int sig)
{cout<<"i am signal:"<<sig<<endl;
}
int main()
{cout<<"pid : "<<getpid()<<endl;struct sigaction act,oldact; //创建两个struct sigaction结构体act.sa_handler=handle; //设置自定义信号处理函数sigemptyset(&act.sa_mask); //清空sa_masksigaddset(&act.sa_mask,3); //向sa_mask添加要屏蔽的信号sigaction(2,&act,&oldact); //捕捉信号while(true){sleep(1);}return 0;
}

子进程退出向父进程发送SIGCHLD信号:

  • 子进程在终止时会给父进程发SIGCHLD信号,该信号的默认处理动作是忽略。

  • 父进程可以自定义SIGCHLD信号的处理函数,在信号处理函数中调用wait清理子进程即可。这样父进程只需专心处理自己的工作,不必关心子进程了。

  • 如果需要获取子进程的退出信息,就需要wait等待子进程。但是如果不需要获取子进程的退出信息。可以使用以下代码,通过信号的方式回收子进程,使得父进程不用等待子进程。

signal(SIGCHLD,SIG_IGN); //这种方式只对Linux操作系统有效
http://www.lryc.cn/news/447668.html

相关文章:

  • HarmonyOS鸿蒙开发实战( Beta5.0)页面加载效果实现详解实践案例
  • 计算机网络中的VLAN详解
  • Nacos学习
  • 后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0926)
  • 验收测试:从需求到交付的全程把控!
  • 第十七节 鼠标的操作与相应
  • 深圳·2025胶粘剂展会 BOND第六届胶展
  • 什么是网络安全自动化以及优势与挑战
  • java中的ArrayList和LinkedList的底层剖析
  • 占领矩阵-第15届蓝桥省赛Scratch中级组真题第5题
  • [论文笔记] Chain-of-Thought Reasoning without Prompting
  • C++八股进阶
  • 渗透测试--文件上传常用绕过方式
  • 音视频生态下Unity3D和虚幻引擎(Unreal Engine)的区别
  • 搭建基于H.265编码的RTSP推流云服务器
  • C++20 std::format
  • Python基础知识 (九)os模块、异常、异常的传递性
  • 鸿蒙手势交互(三:组合手势)
  • 【计算机方向】中科院二区TOP神刊!国人发文友好,刊文量高,录用容易!
  • Stable Diffusion 保姆级教程
  • 踩坑记录:adb修改settings数据库ContentObserver无回调
  • JAVA毕业设计183—基于Java+Springboot+vue的旅游小程序系统(源代码+数据库)
  • [大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26
  • WiFi无线连接管理安卓设备工具:WiFiADB
  • Django项目配置日志
  • 在IntelliJ IDEA中设置文件自动定位
  • 机器学习笔记 - week6 -(十一、机器学习系统的设计)
  • 对c语言中的指针进行深入全面的解析
  • xxl-job 适配达梦数据库
  • Linux 配置与管理 SWAP(虚拟内存)