秒懂:父子进程

news2024/11/15 5:20:32

1.概念

在操作系统中,当一个进程(称为父进程)创建另一个新进程(称为子进程)时,父子进程之间建立了一种特殊的关系。

2.创建父子进程的方法

2.1 fork()函数详解:

fork 是一个系统调用(也是库函数),用于创建一个新的进程。它会复制调用进程(父进程)的内存和上下文,包括代码段、数据段、堆栈等,然后将这个副本分配给新创建的进程(子进程)。

fork 系统调用的原型通常定义在 <unistd.h> 头文件中。

我们要创建一个进程,那一定涉及到访问操作系统的内部数据,肯定也需要使用系统调用

#include <unistd.h>

pid_t fork(void);

// pid_t 是一个类型,用于表示进程 ID,fork 函数返回的是一个 pid_t 类型的值。

fork() 调用成功时,在父进程中返回子进程的 PID,而在子进程中返回 0。
如果 fork 调用失败,则返回一个负数,表示错误。


在 fork 调用后,父子进程都会继续执行 fork 调用之后的指令,但是它们会在不同的地址空间中运行,即它们各自拥有独立的内存空间。这意味着,父进程和子进程之间的数据是相互独立的,任何一个进程对内存的修改都不会影响到另一个进程。

父子进程代码共享的原理是采用写时拷贝(copy-on-write)。

在 fork 调用后,操作系统并不会立即复制父进程的内存给子进程,而是让父子进程共享同一段内存空间。只有当其中一个进程试图修改共享的内存时,操作系统才会复制该内存页,确保修改不会影响到其他进程。这样做可以节省内存,并提高效率。

2.2 fork()函数疑问


怎么理解fork()是系统调用也是库函数

系统调用(System Call):系统调用是操作系统提供给用户空间程序访问内核功能的一种机制。fork 系统调用是由操作系统内核实现的,用于创建一个新的进程。当用户程序调用 fork 时,实际上是请求操作系统内核为其创建一个新的进程,这需要通过系统调用来完成。

库函数:库函数是一组在编程时可调用的函数,这些函数通常包含在标准库或其他库中。在 Unix-like 系统中,C 标准库中包含了对 fork 函数的封装,这意味着用户程序可以通过调用 fork 库函数来发起对 fork 系统调用的请求,而不必直接调用系统调用。

从用户程序的角度来看,fork 可以被视为一个库函数,因为它是通过调用库函数来实现的。

从操作系统内核的角度来看,fork 是一个系统调用,因为它需要通过内核来创建新的进程。

fork 函数在调用后会返回两次,这是因为它是一个复制当前进程的系统调用。下面是对这两个返回值的解释:

1.给父进程返回子进程的 PID:在父进程中,fork 返回新创建子进程的进程 ID(PID),这个 PID 是子进程的标识符,父进程通过这个 PID 可以识别并操作子进程。就像一个父亲有很多孩子,pid和姓名一样,只是为了区分它们。

2.给子进程返回 0在子进程中,fork 也会返回一个值,但是返回的是 0,子进程是通过复制父进程的地址空间而创建的,因此子进程从父进程继承了大部分的内存布局和数据。为了区分父进程和子进程,fork 在子进程中返回 0,表示这是子进程执行的代码路径。

3. fork函数为什么会返回两次:fork 函数在调用后会创建一个新的子进程(在return之前就已经创建好子进程了),新的子进程拥有父进程的副本(也包括return)。因此,fork 在执行时会返回两次:一次在父进程中(返回子进程的 PID),另一次在子进程中(返回 0)。这样做是为了让父进程和子进程可以根据返回值来执行不同的代码路径。

2.3 getpid() 和 getppid()


在Unix/Linux系统中,可以使用 getpid() 系统调用来获取当前进程的PID,使用 getppid() 系统调用来获取当前进程的父进程的PID。

以下是这两个系统调用的简要说明:

getpid():该系统调用返回调用进程的PID,即当前进程的PID。

getppid():该系统调用返回调用进程的父进程的PID,即当前进程的父进程的PID。

2.4代码演示:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   
    int ret = fork();
    if(ret < 0){
        perror("fork");
        return 1;
        }
    else if(ret == 0){ //child
        printf("I am child : %d!, ret: %d\n", getpid(), ret);
        }
        else{ //father
            printf("I am father : %d!, ret: %d\n", getpid(), ret);
        }
        sleep(1);
        return 0;
}

执行结果:

注意:

任何平台,进程在运行时,都具有独立性!!!

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

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

相关文章

Qt 加载 WPS 时提示要登录

项目中Qt加载word时 默认用wps打开word文档 程序一运行老是提示要立即登录 看着很烦 可以按下面的方法去掉这个烦人的东西 在下面的项目中新建字符串enableforceloginforfirstinstalldevice&#xff0c;值为false即可。

品聚文化--打造票圈神话

热烈祝贺鸿玉祥安文票9月5号正式启动运营 尊敬的各位领导、合作伙伴、客户以及全体品聚的家人们 今天&#xff0c;我们迎来了公司文票正式启动这一历史性的时刻&#xff0c;在此&#xff0c;我谨代表公司及全体员工&#xff0c;向所有关心和支持我们发展的朋友们表示最热烈的祝…

Java进阶13讲__第十讲

IO流、File 1. File 1.1 创建对象 1.1.1 File指向 指向文件 File f1 new File("E:\\TableFace\\Finished\\合同审核.txt"); 指向文件夹 File f2 new File("E:\\TableFace\\Finished"); 指向不存在文件 File f2 new File("E:\\T…

用最简单的话来解释大模型中的Transformer架构

开篇 我个人的观点是要想系统而又透彻地理解 Transformer&#xff0c;至少要遵循下面这样一个思路&#xff08;步骤&#xff09;&#xff1a; 理解NLP基础 在探讨Transformers之前&#xff0c;了解自然语言处理(NLP)的一些基本知识至关重要。NLP使计算机能够理解和生成自然语…

GEE数据集:美国国家结构清单(NSI)用于评估和分析自然灾害的点式结构清单

简介 国家结构清单 国家结构清单&#xff08;NSI&#xff09;是一个数据库系统&#xff0c;其中包含不同质量和空间覆盖范围的结构清单。 NSI 数据库的目的是促进存储和共享用于评估和分析自然灾害的点式结构清单。 洪水风险是主要用途&#xff0c;但每个结构都有足够的数据来…

prompt实用技巧-竞对分析-飞书发布会上多维表和低代码平台原型分析

prompt engineer 工程师的一天 ,竞品分析相关。 “作为企业软件咨询公司整理出uipath,salesforce,airtable,zapier的官网地址&#xff0c;功能点详情&#xff0c;优势&#xff0c;劣势 生成表格4*4&#xff0c;表头为:uipath,salesforce,airtable,zapier, 第一例为&…

Nvidia股价反弹,博雅分析师力挺“行业首选”

在周四的交易中&#xff0c;Nvidia&#xff08;NVDA&#xff09;股价成功收复部分失地&#xff0c;上涨1%&#xff0c;这一积极走势得益于博雅全球研究公司&#xff08;美国银行全球研究&#xff09;发布的一份看涨报告。博雅分析师重申了对Nvidia的“行业首选”评级&#xff0…

『功能项目』Unity本地数据库读取进入游戏【29】

本章项目成果展示 打开上一篇28Unity连接读取本地数据库的项目&#xff0c; 本章要做的事情是通过读取本地数据库登录进入游戏场景 首先创建一个脚本文件夹&#xff1a; 新建脚本&#xff1a;MySqlAccess.cs 编写脚本&#xff1a;MySqlAccess.cs using UnityEngine; using MyS…

自定义v-model的两种形式

1 使用update &#xff08;1&#xff09;在组件中使用v-model"value" &#xff08;2&#xff09;props中接收modelValue &#xff08;3&#xff09;然后在value值发生变化的时候&#xff1a;this.$emit("update:modelValue", this.value); &#xff08;4&…

【压力测试】如何确定系统最大并发用户数?

一、明确测试目的与了解需求 明确测试目的&#xff1a;首先需要明确测试的目的&#xff0c;即为什么要确定系统的最大并发用户数。这通常与业务需求、系统预期的最大用户负载以及系统的稳定性要求相关。 了解业务需求&#xff1a;深入了解系统的业务特性&#xff0c;包括用户行…

大语言模型(LLM)如何更好地继续预训练(Continue PreTraining)

预训练&#xff08;Pretraining&#xff09;是一个非常消耗资源的工作&#xff0c;尤其在 LLM 时代。随着LLama2的开源&#xff0c;越来越多人都开始尝试在这个强大的英文基座模型上进行中文增强。但&#xff0c;我们如何才能保证模型在既学到「中文知识」的情况下&#xff0c;…

这本PyTorch官方出品的《Deep Learning With PyTorch》终于有了中文版!

导读&#xff1a; 一些线上或线下的关于PyTorch的课程和大学里的计划课程&#xff0c;以及大量的线上博客和教程&#xff0c;使得PyTorch学习起来更容易。然而&#xff0c;关于PyTorch的图书很少。随着本书的出版&#xff0c;我们最终有了一本关于PyTorch的官方权威著作。 它非…

下载适用于 Linux 的 MongoDB Shell教程

下载适用于 Linux 的 MongoDB Shell教程 下载地址 MongoDB Shell Download | MongoDB 2、往下拉&#xff0c;选择Linux对应的版本下载

怎么快速入门大模型技术——AI大模型学习方法

“ 师父领进门&#xff0c;修行在个人 ” 有两个成语&#xff0c;一个是事半功倍&#xff0c;一个是事倍功半&#xff1b;为什么会有这种情况&#xff1f;‍‍‍‍‍‍‍ 原因就是方式方法的问题&#xff0c;有些人掌握了正确的方法就会觉得做什么事都顺风顺水&#xff0c;事…

电脑黑屏开不了机怎么办?教你4招轻松解决

在使用电脑的过程中&#xff0c;有时候会遇到电脑黑屏开不了机的情况。这种问题确实让人感到困惑和焦虑&#xff0c;因为它意味着硬件故障或者系统问题。本文将针对电脑黑屏开不了机的原因进行分析&#xff0c;并提供相应的解决方法&#xff0c;帮助大家快速解决这一问题。 操作…

孙宇晨:区块链领域的时代先锋,每一步引领未来趋势

​孙宇晨&#xff0c;这位在区块链领域崭露头角的青年企业家&#xff0c;凭借着敏锐的洞察力和坚定的决心&#xff0c;成为了数字经济时代的领航者。他的每一步&#xff0c;都走在技术创新的最前沿&#xff0c;推动着区块链技术的发展与应用&#xff0c;给全球经济带来了深远的…

智慧水务:“六变形战士”,这很全面!

在当今快速发展的智慧城市建设中&#xff0c;‌水务管理作为城市运行的重要一环&#xff0c;‌其智能化、‌高效化的需求日益凸显。‌为了满足这一需求&#xff0c;‌一款全新的智慧水务平台——“六边形战士”应运而生&#xff0c;‌它以“生产管网营销运营调度APP”六大核心功…

测试CUDA __threadfence的行为

CUDA __threadfence测试 一.测试小结二.复现过程三.截图 测试CUDA __threadfence的行为 一.测试小结 测例0:没有任何同步,执行到leftt0时,left的数据未加载完成,出现long soreboard的stall 405次测例1:__threadfence会等待memory数据加载完成,leftt0没有出现long scoreboard的…

基于golang实现简单的文件监控

基于golang实现简单的文件监控 package mainimport ("log""syscall""unsafe" )type FileNotifyInformation struct {Action uint32Name string }func Fswatch(path string) (chan FileNotifyInformation, error) {handle, err : syscall.Crea…

vscode中暂存块功能不能用了

vscode中暂存文件修改可以按每一处暂存&#xff0c;而不用一次暂存整个文件的修改&#xff0c;今天发现这个功能不能用了&#xff0c;不知道啥原因&#xff0c;记录一下。