linux的fork-父进程和子进程关系

父进程与子进程关系

在UNIX和类UNIX操作系统中,fork 是一个系统调用,它用于创建一个新进程,这个新进程被称为子进程。子进程是父进程的一个副本,它继承了父进程的许多属性,例如打开的文件描述符、信号处理设置等,但是它有自己的唯一进程ID(PID)和内存空间。
fork 函数的原型如下:

pid_t fork(void);

fork 被调用时,它会返回两次:

  1. 在父进程中,fork 返回子进程的PID。
  2. 在子进程中,fork 返回0。
  3. 如果 fork 失败,它返回-1,并设置 errno 来指示错误原因。
    fork 调用成功后,操作系统会创建一个新的进程表项,并将父进程的许多属性复制到子进程中。这包括:
  • 父进程的内存映像,包括代码段、数据段、堆栈段等。
  • 父进程的打开文件描述符表。
  • 父进程的信号处理设置。
  • 父进程的当前工作目录。
  • 父进程的环境变量。
    但是,子进程有一些自己的独立属性,例如:
  • 它有自己的唯一的PID。
  • 它的父进程PID(PPID)是原父进程的PID。
  • 它有自己的独立的内存空间,虽然最初与父进程相同。
  • 它有自己的程序计数器(PC),用于跟踪下一条要执行的指令。
    fork 是UNIX操作系统中“一切皆文件”哲学的体现,它允许进程通过复制自己的方式来创建新进程,这是进程控制的基础。
    示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
    pid_t pid = fork();
    if (pid < 0) {
        // 错误:fork失败
        fprintf(stderr, "Fork failed");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        // 子进程
        printf("Hello from the child process!\n");
    } else {
        // 父进程
        printf("Hello from the parent process! Child PID: %d\n", pid);
    }
    // 父子进程都会执行的代码
    printf("This will be printed by both parent and child.\n");
    return 0;
}

在这个例子中,程序将输出两条 “This will be printed by both parent and child.” 消息,一条来自父进程,一条来自子进程。父进程还会打印出子进程的PID。

父进程退出后子进程是否会退出?

在UNIX和类UNIX操作系统中,当父进程退出时,子进程并不会自动退出。子进程将继续运行,除非它自己终止或者被外部信号终止。当一个父进程退出时,如果它有子进程,这些子进程将成为“孤儿进程”,并由 init 进程(PID 为 1)接管。init 进程会自动收割这些孤儿进程,即当它们终止时回收它们占用的资源。

如何一起退出?

如果你希望父进程退出时子进程也退出,你需要采取一些额外的步骤。这里有几种方法可以实现:

  1. 信号处理:父进程可以在退出前向子进程发送一个信号(例如 SIGTERM),子进程可以捕获这个信号并执行清理操作后退出。

  2. 使用进程组:可以将父进程和子进程放在同一个进程组中,然后向整个进程组发送信号。所有属于该进程组的进程都会收到这个信号。

  3. 使用会话:如果父进程创建了一个新的会话,并且子进程是这个会话的成员,那么当父进程退出时,子进程可能会收到 SIGHUP 信号。子进程可以捕获这个信号并退出。

  4. 使用监督者进程:可以使用如 supervisord 这样的监督者进程来管理父进程和子进程。监督者可以确保当父进程退出时,子进程也相应地退出。

  5. 使用 PID 文件:父进程可以在退出前创建一个包含子进程 PID 的文件。然后,可以编写一个外部脚本或程序来监视父进程的状态,并在父进程退出时读取 PID 文件,并向子进程发送信号。

示例:使用信号处理

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void handle_sigterm(int sig) {
    printf("Child process received SIGTERM, exiting.\n");
    exit(EXIT_SUCCESS);
}
int main() {
    pid_t pid = fork();
    if (pid < 0) {
        // 错误:fork失败
        fprintf(stderr, "Fork failed");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        // 子进程
        signal(SIGTERM, handle_sigterm);
        while (1) {
            // 子进程的工作循环
            sleep(1);
        }
    } else {
        // 父进程
        sleep(5); // 父进程运行一段时间后
        kill(pid, SIGTERM); // 向子进程发送SIGTERM信号
        exit(EXIT_SUCCESS); // 父进程退出
    }
    return 0;
}

在这个例子中,父进程在退出前向子进程发送了 SIGTERM 信号。子进程捕获了这个信号并退出。

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

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

相关文章

Echarts集成Vue2个人总结与反思

协同净焦水处理系统 统计模块 环境部署 1、创建数据库ry-cloud并导入数据脚本ry_2021xxxx.sql&#xff08;必须&#xff09;&#xff0c;quartz.sql&#xff08;可选&#xff09; 2、创建数据库ry-config并导入数据脚本ry_config_2021xxxx.sql&#xff08;必须&#xff09; …

aardio —— 虚表 —— 模拟属性框

写了个简单的属性框例程&#xff0c;抛砖引玉&#xff0c;期待你做出更丰富强大的功能。 本例演示&#xff1a;折叠子行、选择框、输入文本、输入数值、下拉选择、选择图片、选择颜色、选择字体等功能。 只有想不到&#xff0c;没有做不到&#xff0c;发挥你的想象力吧。 imp…

《Vue3 七》插槽 Slot

插槽可以让组件的使用者来决定组件中的某一块区域到底存放什么元素和内容。 使用插槽&#xff1a; 插槽的使用过程其实就是抽取共性、预留不同。将共同的元素、内容依然留在组件内进行封装&#xff1b;将不同的元素使用 slot 作为占位&#xff0c;让外部决定到底显示什么样的…

Functions

1.trigonometric function 定义和图像 反三角函数是三角函数的反函数 versin(verse -sin)&#xff1a;1/sinx 性质 三角函数的公式 三角恒等式 周期性公式&#xff1a;直接画图记 公式记忆&#xff1a;先想象一个在第一象限的锐角 1&#xff1a;在坐标轴中旋转360 2.sin&am…

微服务-网关、配置热更新、动态路由

祝小伙伴们每天开心 每天都能进步一点点 目录 1 网关路由 1.1 认识网关 什么是网关捏 网关实现方案 1.2 快速入门 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;配置路由 1.3 路由过滤 路由规则语法 常见属性 predicates&#xff08;路由断言&…

uni-app 资源引用(绝对路径和相对路径)方法汇总

文章目录 一、前言&#x1f343;二、绝对路径和相对路径2.1 绝对路径2.2 相对路径 三、引用组件四、引用js4.1 js 文件引入4.2 NPM支持 五、引用css六、引用json6.1 json文件引入 七、引用静态资源7.1 模板内引入静态资源7.2 css 引入静态资源7.3 js/uts 引入静态资源7.4 静态资…

机器学习基础-支持向量机SVM

目录 基本概念和定义 1. 超平面&#xff08;Hyperplane&#xff09; 2. 支持向量&#xff08;Support Vectors&#xff09; 3. 线性可分 4. 边界 SVM算法基本思想和分类 基本思想 间隔最大化 间隔&#xff08;Margin&#xff09; 软边距 SVM 核函数的概念 基本概念…

TypyScript从入门到精通

TypyScript从入门到精通 TypyScript 是什么&#xff1f;增加了什么环境搭建二、为何需要 TypeScript三、编译 TypeScript四、类型声明五、类型推断基本类型六、类型总览JavaScript 中的数据类型TypeScript 中的数据类型1. 上述所有 JavaScript 类型2. 六个新类型&#xff1a;3.…

mybatisX插件的使用,以及打包成配置

装mybatisX插件&#xff1b; idea连接数据库&#xff1b; 点击mybatisx-generator&#xff0c;设置自己装mybatisX插件&#xff1b; idea连接数据库&#xff1b; 点击mybatisx-generator&#xff0c;设置自己要的包和类&#xff1b; 如果要把自己的配置设置成一个自定义模板&a…

简单的jmeter数据请求学习

简单的jmeter数据请求学习 1.需求 我们的流程服务由原来的workflow-server调用wfms进行了优化&#xff0c;将wfms服务操作并入了workflow-server中&#xff0c;去除了原来的webservice服务调用形式&#xff0c;增加了并发处理&#xff0c;现在想测试模拟一下&#xff0c;在一…

Java后端常用的4种请求方式(通俗易懂)

文章目录 前言通用接口类(ControllerDemo)通用实体类(UserEntity)通用响应类(HttpClientResult)成功截图(先启动项目,然后右键执行main方法) HttpClientHttpClient 的主要类代码案例导入依赖工具类(HttpClientUtil)测试类 HttpURLConnection简介调用步骤代码案例导入依赖工具类…

floodfill算法_dfs

之前我们用BFS解决floodfil算法 BFS 解决 FloodFill 算法_图像渲染_岛屿数量_被围绕的区域-CSDN博客 下面我们用dfs进行解决 733. 图像渲染 从初始位置开始dfs&#xff0c;找和它值相同的&#xff0c;并在dfs过程中把值改为目标值。因为会改变原数组&#xff0c;不用vis记录经过…

40% 降本:多点 DMALL x StarRocks 的湖仓升级实战

小编导读&#xff1a; 多点 DMALL 成立于2015年&#xff0c;持续深耕零售业&#xff0c;为企业提供一站式全渠道数字零售解决方案 DMALL OS。作为 DMALL OS 数字化能力的技术底座&#xff0c;大数据平台历经多次迭代平稳支撑了公司 To B 业务的快速开展。随着国家产业升级和云原…

AI-Talk开发板之超拟人

一、说明 运行duomotai_ap sdk下的LLM_chat例程&#xff0c;实现开发板和超拟人大模型进行语音交互&#xff0c;支持单轮和多轮交互。 二、SDK更新 v2.3.0及以上的SDK版本才支持超拟人&#xff0c;如果当前SDK在v2.3.o以下&#xff0c;需要更新SDK。在SDK目录(duomotai_ap)下…

graylog+sidecar通过docker-compose部署并采集SSH登录日志

文章目录 前言一、graylog日志系统数据流向清洗图二、资源准备及部署1.docker-compose部署2.准备docker-compose.yml文件3.安装graylog-sidecar并配置4.给sidecar创建token 三、graylog-WEB配置采集SSH日志1.配置Inputs2.创建sidecar采集器3.将页面创建好的sidecar与服务器绑定…

【Vue.js】监听器功能(EventListener)的实际应用【合集】

目录 &#x1f914;在实际开发过程中&#xff0c;我遇到了一个颇为棘手的小问题 &#x1f60b;解决这个小问题 问题出现的原因剖析 解决方法阐述 问题成功解决&#xff01;​ &#x1f4d6;相关知识总结 基本概念 使用方法 实际应用场景 &#x1f914;在实际开发过程中…

2023年区块链职业技能大赛——区块链应用技术(一)模块一

模块一:区块链产品方案设计及系统运维: 任务1-1:区块链产品需求分析与方案设计 1.依据给定区块链食品溯源系统的业务架构图&#xff0c;对考题进行业务分析&#xff0c;可能多的去考虑一个业务系统所需要的模块&#xff0c;使用Visio或思维导图工具展现本系统的基本设计概念和…

【HarmonyOS应用开发——ArkTS语言】欢迎界面(启动加载页)的实现【合集】

目录 &#x1f60b;环境配置&#xff1a;华为HarmonyOS开发者 &#x1f4fa;演示效果&#xff1a; &#x1f4d6;实验步骤及方法&#xff1a; 一、在media文件夹中添加想要使用的图片素材​ 二、在entry/src/main/ets/page目录下创建Welcome.ets文件 1. 整体结构与组件声…

Flutter Android修改应用名称、应用图片、应用启动画面

修改应用名称 打开Android Studio&#xff0c;打开对应项目的android文件。 选择app下面的manifests->AndroidManifest.xml文件&#xff0c;将android:label"bluetoothdemo2"中的bluetoothdemo2改成自己想要的名称。重新启动或者重新打包&#xff0c;应用的名称…

MES管理系统如何解决企业制造瓶颈

在当今全球化与信息化高度融合的时代&#xff0c;制造业作为支撑国家经济发展的关键产业&#xff0c;正处于发展的十字路口&#xff0c;面临着一系列严峻挑战。从日常所需的各类用品到先进的高端工业产品&#xff0c;制造业的稳定发展对经济的稳健运行至关重要&#xff0c;一旦…