Linux子进程信号处理机制

news2024/12/23 16:51:49

Linux中子进程的信号处理与父进程的联系有以下三条:

  • fork后子进程会继承父进程绑定的信号处理函数(很好解释,子进程会拷贝父进程的代码,包括信号处理函数
  • 如果子进程调用exec族函数,子进程代码段被新的程序覆盖,因此在这种情况下子进程不会继承信号处理函数
  • 无论子进程是否调用exec族函数,都会继承父进程的信号掩码

下面通过程序逐个验证上面的三种说法:

结论一:子进程不调用exec族函数,则继承父进程的信号处理函数

/**
  ****************************************************************************************
  * @file    30_子进程信号处理机制1.c
  * @author  GuiStar-李什么恩
  * @version V1.1.0
  * @date    2023-4-22
  * @brief   子进程不调用exec族函数,则继承父进程的信号处理函数
  ****************************************************************************************
  */
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>

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

int main(void)
{
	struct sigaction sig={
		0
	};
	int ret;
	sig.sa_handler = sig_handler;
	sig.sa_flags = 0;
	ret = sigaction(SIGINT, &sig, NULL);
	if(ret==-1){
		perror("sigaction error");
		exit(-1);
	}

	switch(fork()){
	case -1:
		perror("fork erro ");
		exit(-1);
	case 0:
		printf("I am child ,PID=%d\n",getpid());
		while(1){
			sleep(1);
		}
		_exit(0);
	default:
		printf("I am parent ,PID=%d\n",getpid());
		while(1)
			sleep(1);
		break;
	}
	exit(0);
}

运行结果:
在这里插入图片描述

可以看到,每次发送SIGINT信号(即按下ctrl+c,向前台进程组发送SIGINT信号),都会响应两侧信号处理函数,一次是父进程响应,一次是子进程响应。


结论二:如果子进程调用exec族函数,则不会继承信号处理函数

验证这个结论需要子进程调用exec族函数去执行另外一个可执行文件,因此要先编写一个测试的程序,把它编译成名字为b.out的可执行文件,这个程序如下:

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

int main(void)
{
	while(1){
		sleep(1);
	}
}
//程序功能很简单,在前台不断打印字符串

然后编写测试程序,如下:

/**
  ****************************************************************************************
  * @file    31_子进程信号处理机制2.c
  * @author  GuiStar-李什么恩
  * @version V1.1.0
  * @date    2023-4-22
  * @brief   fork后如果子进程调用exec族函数,则不会继承信号处理函数
  ****************************************************************************************
  */
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>

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

int main(void)
{
	struct sigaction sig={
		0
	};
	int ret;
	sig.sa_handler = sig_handler;
	sig.sa_flags = 0;
	ret = sigaction(SIGINT, &sig, NULL);
	if(ret==-1){
		perror("sigaction error");
		exit(-1);
	}

	switch(fork()){
	case -1:
		perror("fork erro ");
		exit(-1);
	case 0:
		printf("I am a child,PID=%d\n",getpid());
		execl("./b.out","./b.out",NULL);
		_exit(0);
	default:
		printf("I am parent ,PID=%d\n",getpid());
		while(1)
			sleep(1);
		break;
	}
	exit(0);
}

运行结果:
在这里插入图片描述

可以发现,每次发送SIGINT信号,都只有父进程响应


结论三:无论子进程是否调用exec族函数,都会继承父进程的信号掩码

/**
  ****************************************************************************************
  * @file    33_子进程信号处理机制1.c
  * @author  GuiStar-李什么恩
  * @version V1.1.0
  * @date    2023-4-22
  * @brief   fork后无论子进程是否调用exec族函数,都会继承父进程的信号掩码
  ****************************************************************************************
  */
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
	sigset_t sig_set;
	int ret;

	sigemptyset(&sig_set);
	sigaddset(&sig_set,SIGINT);
	ret = sigprocmask(SIG_BLOCK,&sig_set,NULL);
	if(ret==-1){
		perror("sigprocmask error");
		exit(-1);
	}

	switch(fork()){
	case -1:
		perror("fork erro ");
		exit(-1);
	case 0:
		printf("I am a child,PID=%d\n",getpid());
		execl("./b.out","./b.out",NULL);
		_exit(0);
	default:
		printf("I am parent ,PID=%d\n",getpid());
		while(1)
			sleep(1);
		break;
	}
	exit(0);
}

该程序仍然使用execl函数是子进程执行结论二编写的b.out程序,运行结果如下:
在这里插入图片描述

可以看到,多次发送SIGINT信号,父进程和子进程都没有响应(因为没有编写SIGINT的信号处理函数,所以如果响应的话,应该执行系统默认响应:终止程序),说明子进程和父进程都屏蔽了SIGINT信号,也就是说子进程继承了父进程的信号掩码

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

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

相关文章

Qt 项目Mingw编译器转换为VS编译器时的错误及解决办法

错误 在mingw生成的项目&#xff0c;转换为VS编译器时通常会报些以下错误&#xff08;C4819警告&#xff0c;C2001错误&#xff0c;C2143错误&#xff09; 原因及解决方式 这一般是由于字符编码引起的&#xff0c;在源代码文件中包含了中文字符导致的。Qt Creator 生成的代码文…

算法的时间复杂度和空间复杂度分析

文章目录 实验目的实验内容实验过程运行结果复杂度分析 实验目的 通过本次实验&#xff0c;了解算法复杂度的分析方法&#xff0c;掌握递归算法时间复杂度的递推计算过程。 实验内容 二路归并排序的算法设计和复杂度分析。 实验过程 1.算法设计 归并排序&#xff1a;是指将…

活动回顾|多模态 AI 开发者的线下聚会@深圳站(内含福利)

回顾来了&#xff01; 4 月 22 日&#xff0c;由 Jina AI 和 OpenMMLab 联合主办的 「多模态 AI 」Office Hours 深圳站圆满结束&#xff0c;迎来了将近 60 位开发者的热情参与&#xff01;现场不仅有别开生面的「开发者集市」供大家打卡赢取好礼&#xff0c;更有四场干货满满的…

传统机器学习(六)集成算法(1)—随机森林算法及案例详解

传统机器学习(六)集成算法(1)—随机森林算法及案例详解 1、概述 集成学习&#xff08;Ensemble Learning&#xff09;就是通过某种策略将多个模型集成起来&#xff0c;通过群体决策来提高决策准确率。 集成学习首要的问题是选择什么样的学习器以及如何集成多个基学习器&…

杂谈 看唯工具论的问题 与 瑞典马工的一些言论 如何辩证看

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

华为OD机试真题(Java),根据员工出勤信息,判断本次是否能获得出勤奖(100%通过+复盘思路)

一、题目描述 公司用一个字符串来标识员工的出勤信息 absent&#xff1a;缺勤late&#xff1a;迟到leaveearly&#xff1a;早退present&#xff1a;正常上班 现需根据员工出勤信息,判断本次是否能获得出勤奖&#xff0c;能获得出勤奖的条件如下&#xff1a; 缺勤不超过1次没…

闲聊之π和e到底是个啥

π和e 1. 圆周率π 耳熟能详的π&#xff0c;到底是什么&#xff0c;怎么来的&#xff1f; 圆周率π&#xff0c;圆的周长C2πr&#xff0c;其中r是圆的半径 1.1 刘徽割圆术 如图中所示&#xff0c;作出圆内的正十二边形&#xff0c;正二十四边形&#xff0c;…&#xff0c;用…

倾斜摄影三维模型OSGB格式 到OBJ 格式转换几个软件操作方法

倾斜摄影三维模型OSGB格式 到OBJ 格式转换几个软件操作方法 倾斜摄影三维模型是一种重要的三维地理信息数据&#xff0c;通常以OSGB格式保存。但在不同的三维软件中使用时&#xff0c;需要将其转换为更通用的OBJ格式。本文将介绍在技术上如何将OSGB格式的倾斜摄影三维模型转换为…

手机投屏到电脑的实用工具

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 背景说明 最近在项目开发工作中需要将手机屏幕投影到PC端&#xff0c;并通过PC端操作手机。为了满足该项开发需求&#xff0c;在项目小组中采用了Vysor作为工具。 Vysor介…

手写axios源码系列四:interceptor拦截器

文章目录 一、拦截器 interceptor1、创建 InterceptorManager.js 文件2、Axios 中实例化 InterceptorManager 类3、总结 在本系列的第一篇章节 手写axios源码系列一&#xff1a;axios核心知识点 中已经介绍过一些拦截器的基础知识&#xff0c;可知拦截器分为&#xff1a; 请求…

24从零开始学Java之如何正确地使用一维数组

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在之前的文章中&#xff0c;壹哥给大家讲解了java里的顺序结构、分支结构、循环结构等内容&#xff0…

diffusion扩散模型之hello world

以mnist图像生成样本为例&#xff0c;详细解释diffusion的每个步骤和过程 扩散模型包括两个过程&#xff1a;前向过程&#xff08;forward process&#xff09;和反向过程&#xff08;reverse process&#xff09;&#xff0c;其中前向过程又称为扩散过程&#xff08;diffusio…

Taro React组件开发(9) —— RuiCountDown 倒计时

1. 需求实现 根据传入的格式,返回倒计时的文本字段;时间格式需要自定义,需要返回对应时间的值;对毫秒级的时间进行渲染;自定义时间的样式;手动控制倒计时的开始、暂停和重置。2. 需求实现 查找网上类似组件 uView CountDown 倒计时;由于 uView CountDown 倒计时 是使用 …

深度学习 - 42.特征交叉与 SetNET、Bilinear Interaction 与 FiBiNet

目录 一.引言 二.摘要 - ABSTRACT 三.介绍 - INTRODUCTION 四.相关工作 - RELATED WORK 1.因式分解机及其变体 - Factorization Machine and Its relevant variants 2. 基于深度学习的点击率模型 - Deep Learning based CTR Models 3.SENET Module 五.FiBiNet Model 1…

【嵌入式】HC32F定时器PWM捕获+APC芯片实现模拟AD采样

目录 一 项目背景 二 原理说明 三 设计实现——定时器初始化 四 设计实现——PWM捕获 五 梳理总结 一 项目背景 目前使用了TI的ADC采样芯片ADS1018实现模拟量4-20mA/0-20mA的采样&#xff0c;原理是将外部输入的模拟量信号4-20mA&#xff0c;经由并联的两个100Ω电阻&#…

day-01 one-day projects

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大一在校生&#xff0c;web前端开发专业 &#x1f921; 个人主页&#xff1a;python学不会123 &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习…

AIGC席卷,抖快、阅文、知乎大战网文圈

配图来自Canva可画 成熟的网文市场&#xff0c;时不时进来一条鲶鱼。 经历了二十几个夏秋秋冬&#xff0c;网文市场形成了阅文、晋江、七猫、番茄等平台割据一方稳定的市场格局。后来暗自布局网文市场的知乎、抖音、快手等新玩家开始浮出水面&#xff0c;未来的市场纷争下或许…

Docker持久化方式-v和-volume的区别

docker数据的持久化一直用的是-v的方式&#xff0c;又叫Bind Mounts&#xff08;目录绑定&#xff09;&#xff0c;偶然间发现还有一种通过卷轴来实现持久化的方式&#xff0c;翻了下资料&#xff0c;整理了一下两种方式使用的场景。 -v&#xff08;Bind Mounts&#xff09; …

使用 Apache PDFBox 操作PDF文件

简介 Apache PDFBox库是一个用于处理PDF文档的开源Java工具。该项目允许创建新的PDF文档&#xff0c;操作现有PDF文档&#xff0c;并从PDF文档中提取内容。Apache PDFBox还包括几个命令行实用程序。 Apache PDFBox的主要功能如下&#xff1a; 从PDF文件中提取Unicode文本。将…

浅析提高倾斜摄影超大场景的三维模型轻量化的数据质量关键技术

浅析提高倾斜摄影超大场景的三维模型轻量化的数据质量关键技术 倾斜摄影超大场景的三维模型轻量化的质量关键技术主要包括&#xff1a; 1、保持数据精度。在进行轻量化处理时&#xff0c;必须确保数据的精度不受损失&#xff0c;否则会影响后续分析和应用方案。因此&#xff0…