【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环境高级编程》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机系统的层次结构

操作系统的定义 操作系统&#xff08;Operating System&#xff0c; OS&#xff09;是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff1b;以提供给用户和其他软件方便的接口和环境&#xff1b;它是计算机系统中最基…

【Oracle篇】rman工具实用指南:常用命令详解与实践(第二篇,总共八篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

亚马逊SFP有何优势?跨境卖家又该如何申请?

一、亚马逊SFP概述 亚马逊SFP(Seller Fulfilled Prime)是亚马逊为卖家提供的一项物流计划&#xff0c;旨在让满足条件的卖家能够将其产品纳入Prime服务&#xff0c;获得Prime标识&#xff0c;并直接面向Prime会员市场。通过SFP&#xff0c;卖家可以获得亚马逊的流量倾斜&#…

【低照度图像增强系列(7)】RDDNet算法详解与代码实现(同济大学|ICME)

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检测…

vue项目中如何使用iconfont

导读&#xff1a;vue项目中引入iconfont的方式 iconfont 的三种使用方法 unicode 不常用Font class 像字体一样使用&#xff0c;默认黑色图标&#xff0c;无法修改颜色Symbol 支持多色图标&#xff0c;更灵活&#xff0c;推荐 一、unicode 略 二、Font class 方式一&#…

完美解决原生小程序点击地图markers上的点获取不到对应的坐标信息

需求&#xff1a;地图上有多个markes点&#xff0c;点击每一个获取对应的数据&#xff0c;再根据当前的坐标信息去调用导航。 出现的问题&#xff1a;每次点击的时候获取不到对应的坐标信息&#xff0c;获取到的信息显然不是想要的 原因&#xff1a; 因为你的id不是number类型&…

阿里云手机adb远程连接出现adb问题unauthorized解决

执行adb shell出现下面错误 adb.exe: device unauthorized. This adb servers $ADB_VENDOR_KEYS is not set Try adb kill-server if that seems wrong. Otherwise check for a confirmation dialog on your device.解决&#xff1a;导入和绑定adb的密钥 重启云手机

[Redis]常见数据和内部编码

相关命令 type (key) type 命令实际返回的就是当前键的数据结构类型&#xff0c;它们分别是&#xff1a;string&#xff08;字符串&#xff09;、list&#xff08;列 表&#xff09;、hash&#xff08;哈希&#xff09;、set&#xff08;集合&#xff09;、zset&#xff08;有…

[36#]私有化部署地图套装(全球版)

私有化部署地图套装&#xff08;全球版&#xff09;&#xff0c;是由全球高清卫星影像与100%全球水陆覆盖高程数据组成的全球三维地图套装。 私有化部署地图套装&#xff08;全球版&#xff09; 我们在《难以置信&#xff0c;谁还会用离线地球》一文中&#xff0c;为大家分享…

7 Series FPGAs Integrated Block for PCI Express IP核 Advanced模式配置详解(三)

1 TL Settings Transaction Layer (TL)设置只在Advanced模式下有效。 Endpoint: Unlock and PME_Turn_Off Messages: 与端点的电源管理相关&#xff0c;允许发送解锁和电源管理事件关闭消息。 Root Port: Error Messages: Error Correctable&#xff08;错误可纠正&#xff09…

IO游戏设计思路

1、TCP ,UDP ,KCP ,QUIC TCP 协议最常用的协议 UDP协议非常规的协议&#xff0c;因为需要在线广播&#xff0c;貌似运营商会有一些影响 KCP 基于UDP的协议&#xff0c;GitHub - l42111996/java-Kcp: 基于java的netty实现的可靠udp网络库(kcp算法)&#xff0c;包含fec实现&am…

增强版 Kimi:AI 驱动的智能创作平台,实现一站式内容生成(图片、PPT、PDF)!

前言 基于扣子 Coze 零代码平台&#xff0c;我们从零到一轻松实现了专属 Bot 机器人的搭建。 AI 大模型&#xff08;LLM&#xff09;、智能体&#xff08;Agent&#xff09;、知识库、向量数据库、知识图谱&#xff0c;RAG&#xff0c;AGI 的不同形态愈发显现&#xff0c;如何…

GEO数据挖掘-PCA、差异分析

From 生物技能树 GEO数据挖掘第二节 文章目录 探针注释自主注释流程(了解)PCA图、top1000基因热图探针注释查看示例代码 top 1000 sd 热图离散基因热图&#xff0c;top1000表达基因&#xff0c;只是看一下&#xff0c;不用放文章里 差异分析火山图差异基因热图转换id富集分析-K…

安装mpi4py与dlio_profiler_py的总结

安装mpi4py mpi4py是一个Python库&#xff0c;它提供了与MPI&#xff08;Message Passing Interface&#xff09;兼容的接口&#xff0c;使得Python程序能够利用MPI实现并行计算。mpi4py 的核心是基于MPI标准的C/C实现&#xff0c;它能够在高性能计算环境下进行高效的并行处理…

网页版收银系统比安装板收银系统的四大优势

在当今竞争激烈的零售市场中&#xff0c;高效的收银系统对于连锁实体店的管理至关重要。随着科技的不断发展&#xff0c;网页版收银系统成为越来越多零售企业的首选。网页版收银系统以其灵活性、可定制性和便利性&#xff0c;成为现代零售业的利器。本文将探讨网页版收银系统相…

pycharm 关闭项目卡死

PyCharm2023.3.4 关闭一直卡在 closing projects 解决办法&#xff1a; 打开PyCharm&#xff0c; 选择 Help -> Find Action -> 输入 Registry -> 禁用ide.await.scope.completion

MYSQL 集群

1.集群目的:负载均衡 解决高并发 高可用HA 服务可用性 远程灾备 数据有效性 类型:M M-S M-S-S M-M M-M-S-S 原理:在主库把数据更改(DDL DML DCL&#xff09;记录到二进制日志中。 备库I/O线程将主库上的日志复制到自己的中继日志中。 备库SQL线程读取中继日志…

51cto已购买的视频怎么下载到电脑上?

在数字学习的浪潮中&#xff0c;51CTO已成为众多专业人士和爱好者的知识宝库。但购买了视频课程后&#xff0c;如何将其下载到电脑上以便离线学习呢&#xff1f;这不仅是技术问题&#xff0c;更是时间管理和学习效率的关键。本文将为您揭示简单而高效的步骤&#xff0c;无论您使…

前端面试项目细节重难点(已工作|做分享)

面试官提问&#xff1a;需求场景&#xff1a;页面上有一个单选框&#xff0c;有是否两个选项&#xff1a;当用户选择是&#xff0c;出现一个输入框&#xff0c;用户可以输入内容&#xff0c;给后端的保存接口传入参数radio和content这两个字段&#xff0c;值分别是用户选项和输…

西门子WINCC8.0VBS脚本学习讲解

WinCC VBS脚本置位/复位/取反 二进制变量 "TAG1_BOOL1" 进行置位复位取反操作 步骤&#xff1a;按钮-->对象属性-->事件-->单击鼠标VBS动作填入代码如下: 对二进制变量进行复位 对二进制变量进行置位 对二进制变量进行取反 VBS脚本数学运算/读写批处理 …