【Linux】fork和exec中的信号继承探索

fork和exec中的信号继承探索

  • 一、结论
  • 二、代码验证
    • 2.1 代码编写
    • 2.2 代码执行
  • 三、linux源码验证
  • 四、APUE中的验证
  • 五、其他

一、结论

  1. fork时子进程会继承父进程的信号处理方式,包括父进程设置信号为SIG_DFLSIG_IGN或捕获后设置自定义处理函数。
  2. exce时子进程会继承父进程设置为SIG_DFLSIG_IGN的信号。对于捕获后设置自定义处理函数的信号则不继承这个处理函数。

二、代码验证

2.1 代码编写

此处针对exec的情况进行验证,对于单纯fork后的情况不进行说明。

  1. 编写main.c。此处捕获SIGCHLD自定义handle处理方式。当main函数执行后,将fork子进程,同时子进程会exec加载son可执行程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>void handler(int sig) {int status;int pid = waitpid(-1, &status, WNOHANG);if (pid > 0) {printf(">>>>>>>>>>>>>>>A child process has exited, pid: %d\n", pid);}
}int main() {// 设置信号处理函数signal(SIGCHLD, handler);pid_t pid = fork();if (pid == -1) {// fork失败perror("fork");exit(EXIT_FAILURE);} else if (pid == 0) {// 子进程sleep(3);execlp("./son", "son", NULL);} else {// 父进程继续执行,不等待子进程while(1) {printf("Parent process, PID: %d, son PID: %d\n", getpid(), pid);sleep(3);}}return 0;
}

执行 gcc main.c -o main 进行编译

  1. 编写son.c,调用fork创建孙子,孙子进程创建后会exec加载grandson可执行程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{pid_t pid = fork();if (pid == -1) {// fork失败perror("fork");exit(EXIT_FAILURE);} else if (pid == 0) {// 子进程sleep(3);execlp("./grandson", "grandson", NULL);} else {// 父进程继续执行,不等待子进程while(1) {printf("son process, PID: %d, grandson PID: %d\n", getpid(), pid);sleep(3);}}return 0;
}

执行 gcc son.c -o son 进行编译

  1. 编写grandson.c,代码中定期输出语句,类比执行业务代码。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{while(1){printf("I am grandson, running!..., pid=%d\n", getpid());sleep(3);}return 0;
}

执行 gcc grandson.c -o grandson 进行编译

2.2 代码执行

输入 ./main 执行程序,首先会观察到有两个 ./main程序,业务此时fork了
在这里插入图片描述
三秒后500721号进程会执行exec,替换为son程序。son程序加载后会fork一次,故此时有两个son进程
在这里插入图片描述
三秒后500770号进程会执行exec,替换为grandson程序。此时有main,son和grandson进程存在
在这里插入图片描述
当孙子进程退出时(执行kill -9杀死),它将会变为僵尸进程,因为它的父进程即son进程没有调用wait,waitpid或忽略SIGCHLD信号
在这里插入图片描述
结论:验证了父进程捕获信号后自定义处理逻辑,是不继承到子进程的。

此外,当我们将main.c的signal(SIGCHLD, handler);替换为signal(SIGCHLD, SIG_IGN);后,按上述流程执行,杀死孙子进程时,现象如下:
在这里插入图片描述
一旦执行杀死孙子进程,则ps检测不到了,证明它被真正杀死,而不会陷入僵尸状态。

结论:验证了父进程忽略某个信号后,会继承到子进程,子进程同样忽略此信号。

三、linux源码验证

此处从源码角度论证fork时子进程会继承父进程的信号处理方式,包括父进程设置信号为SIG_DFLSIG_IGN或捕获后设置自定义处理函数。
阅读fork.c源码可知:
copy_process函数调用copy_sighand函数&copy_signal函数

在这里插入图片描述

  1. 信号处理函数的继承:在copy_process函数中,当创建新进程(线程)时,如果clone_flags中设置了CLONE_SIGHAND,则共享信号处理函数。如果没有设置,则会复制父进程的信号处理函数。这可以通过copy_sighand函数实现,该函数通过memcpy复制信号处理动作,即sig->action。
  2. 信号状态的复制:在copy_signal函数中,如果clone_flags中没有设置CLONE_THREAD,则会为新进程分配一个新的signal_struct结构体,并且复制父进程的信号限制和一些其他的信号状态。

四、APUE中的验证

  1. 本文的结论1为:fork时子进程会继承父进程的信号处理方式,包括父进程设置信号为SIG_DFLSIG_IGN或捕获后设置自定义处理函数。APUE对结论1的阐述如下:

在这里插入图片描述

  1. 本文的结论2为:exce时子进程会继承父进程设置为SIG_DFLSIG_IGN的信号。对于捕获后设置自定义处理函数的信号则不继承这个处理函数。APUE对结论2的阐述如下:

在这里插入图片描述

五、其他

上文探究了fork和exec对信号的继承情况,那么对于fd的继承情况如何呢?有待后续探索…

ref:
https://www.cnblogs.com/yiyide266/p/13706799.html
《UNIX环境高级编程》

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

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

相关文章

ChatGPT写作指南:掌握5种高效格式成为写作达人【含实用示例】

1. **简洁指令** 当任务较简单时&#xff0c;可以用一小段话来说明&#xff0c;便于理解和执行。如下例&#xff1a; 背景&#xff1a;我负责运营一个旅游主题的社交媒体账号。 角色&#xff1a;作为一位经验丰富的文案创作专家&#xff0c;我擅长打造引人注目的旅游内容…

【无标题】亚马逊5月24日宣布推出2024出口跨境物流加速器计划

亚马逊中国5月24日郑重宣布启动“2024亚马逊出口跨境物流加速器计划”&#xff0c;旨在依托其世界领先的物流网络和前沿技术&#xff0c;结合本土资源&#xff0c;不断优化跨境物流服务&#xff0c;以强化中国卖家在跨境物流供应链管理方面的能力&#xff0c;进而提升整体效率&…

datagridview复选框选中响应

winform经常用datagridview来处理相关的数据显示&#xff0c;如果datagridview有复选框&#xff0c;我们应该如何处理相关选中响应。选择datagridview的cellcontentclick事件&#xff0c;代码如下&#xff1a; bool isSelectedGridViewRow false&#xff1b; private void da…

深度神经网络——什么是 K 均值聚类?

K 均值聚类 K 均值聚类是 无监督学习在所有无监督学习算法中&#xff0c;K 均值聚类可能是使用最广泛的&#xff0c;这要归功于它的强大功能和简单性。 K-means 聚类到底是如何工作的&#xff1f; 简而言之&#xff0c;K 均值聚类的工作原理是 创建参考点&#xff08;质心&am…

Halcon 极坐标转换图像

一、概述 先看效果 将圆形的用极坐标转换成矩性然后再进行识别或者其他缺陷检测&#xff0c;最后在还圆到原图中 二、原理&#xff1a; halcon 圆环类缺陷检测的一种方法&#xff08;极坐标变换法&#xff09;_halcon缺口检测-CSDN博客 图像极坐标变换与反变换&#xff08;…

吴恩达深度学习笔记:超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter tuning)3.4-3.5

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第三周&#xff1a; 超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架&#xff08;Hyperparameter …

Spark SQL【Java API】

前言 之前对 Spark SQL 的影响一直停留在 DSL 语法上面&#xff0c;感觉可以用 SQL 表达的&#xff0c;没有必要用 Java/Scala 去写&#xff0c;但是面试一段时间后&#xff0c;发现不少公司还是在用 SparkSQL 的&#xff0c;京东也在使用 Spark On Hive 而不是我以为的 Hive O…

ubuntu20.04 开机自动挂载外加硬盘

文章目录 一、问题描述二、操作1. 查找新添盘符2. 格式化硬盘文件系统3. 挂载硬盘4. 开机自动挂载5. 取消挂载6. 查看挂载的硬盘信息 一、问题描述 因电脑使用一段时间后自身硬盘不足&#xff0c;需外加硬盘使得电脑自动识别加载。 二、操作 1. 查找新添盘符 sudo blkid自己…

Linux基础命令详解

Linux基础命令详解 1. ls 解释&#xff1a;列出目录内容用法&#xff1a;ls [选项] [文件名]示例&#xff1a;ls -l&#xff08;以长格式显示文件信息&#xff09; 2. cd 解释&#xff1a;更改目录用法&#xff1a;cd [目录名]示例&#xff1a;cd /home&#xff08;切换到/…

# 全面解剖 消息中间件 RocketMQ-(3)

全面解剖 消息中间件 RocketMQ-&#xff08;3&#xff09; 一、RocketMQ – mqadmin 命令介绍 1、mqadmin 管理工具 使用方式 进入 RocketMQ 安装位置&#xff0c;在 bin 目录下执行 ./mqadmin {command} {args} # 进入 RocketMQ 安装目录的 bin 目录下&#xff1a; cd /usr…

免费、开源、好用的 SQL 客户端合集

免费、开源、好用的 SQL 客户端合集 分类 编程技术 0、SQL Chat SQL Chat 是 2023 年 3 月推出的新型 SQL 客户端&#xff0c;它将数据库管理带入了基于聊天的新时代。 SQL Chat 由 ChatGPT 驱动&#xff0c;能够帮你编写和润色 SQL 语句&#xff0c;让数据库操作变得更加智…

微信小程序开发环境的搭建

一、注册微信小程序账号 二、安装微信开发者工具 1.下载微信开发者工具。 官网下载地址&#xff1a;https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/downloads.html 2、选择稳定版Window64下载安装 3、下载完毕后&#xff0c;点击下一步安装 三、使用微信开发者工具…

SQLite查询优化

文章目录 1. 引言2. WHERE子句分析2.1. 索引项使用示例 3. BETWEEN优化4. OR优化4.1. 将OR连接的约束转换为IN运算符4.2. 分别评估OR约束并取结果的并集 5. LIKE优化6. 跳跃扫描优化7. 连接7.1. 手动控制连接顺序7.1.1. 使用 SQLITE_STAT 表手动控制查询计划 1. 引言 给定一个…

C# 特性(Attribute)超详细教程

文章目录 0.前篇1.特性概念2.特性的声明和使用2.1 特性定义语法2.2 特性目标 3.预定义特性3.1 AttributeUsage3.2 Conditional3.3 其它预定义特性 4.MyAttributeHelper&#xff08;特性使用帮助类&#xff09;5.特性应用5.1 添加说明信息并获取5.2 数据验证 0.前篇 学习本文前…

聊聊Python中的文件读写操作

Python 中的文件读写操作是数据处理和存储的基本操作之一。下面&#xff0c;我将详细解释如何在 Python 中进行文件的读写操作。 1. 打开文件 在 Python 中&#xff0c;使用 open() 函数来打开文件。这个函数需要至少一个参数&#xff0c;即文件名&#xff0c;并且返回一个文件…

数据结构和组成

数据结构组成 数据项&#xff1a;一个数据元素可以由若干数据项组成。 数据对象&#xff1a;有相同性质的数据元素的集合&#xff0c;是数据的子集。 数据结构&#xff1a;是相互之间存在一种或多种特定关系的数据元素的集合。 逻辑结构 数据对象中数据元素之间的相互关系 eg: …

深入理解python列表遍历:两种方法详解与实例

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、使用索引遍历列表 三、直接使用元素遍历列表 四、总结 一、引言 在编程过程…

创建python字典的两种方法:直观与函数式

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、直观创建法&#xff1a;直接定义键值对 二、函数式创建法&#xff1a;使用内置函数dict…

CSRF 攻击

概述 CSRF(Cross-site request forgery,跨站请求伪造)。 它是指攻击者利用了用户的身份信息&#xff0c;执行了用户非本意的操作。 它首先引导用户访问一个危险网站&#xff0c;当用户访问网站后&#xff0c;网站会发送请求到被攻击的站点&#xff0c;这次请求会携带用户的c…

拼多多携手中国农业大学,投建陕西佛坪山茱萸科技小院

5月16日下午&#xff0c;中国农业大学陕西佛坪山茱萸科技小院在佛坪县银厂沟村揭牌。佛坪县素有“中国山茱萸之乡”的美誉&#xff0c;是全国山茱萸三大基地之一&#xff0c;当地山茱萸是国家地理标志产品&#xff0c;山茱萸肉产量位居全国第二。 为充分发挥佛坪县得天独厚的山…