首页 > 系统相关 >【Linux】撕开fork的本质,深入了解fork函数原理

【Linux】撕开fork的本质,深入了解fork函数原理

时间:2024-08-20 22:26:23浏览次数:11  
标签:fork 返回 函数 创建 Linux 进程 返回值 撕开

 目录

一、如何使用fork函数?

二、fork函数如何产生两个返回值?

三、if,else语句怎么会同时执行?为什么i会有两个不同的值?子进程创建出来之后去哪里了?

四,为什么给父进程返回子进程的PID,子进程返回0?


一、如何使用fork函数?

在Linux操作系统里,我们可以通过调用fork函数来创建子进程,fork函数是个返回pid_t(其实就是个有符号的int)类型,无参的函数,它可以通过返回两个不同的值来进行区别父子进程

下面是它的一般用法

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

int main()
{
    pid_t i = fork();
    if(i == 0)
    {
        printf("我是子进程\n“);
        printf("子进程:%d  父进程: %d\n",getpid(),getppid());
        printf("\n");
    }
    else if(i > 0)
    {
        printf("我是父进程\n");
        printf("子进程:%d  父进程: %d",getpid(),getppid());
    }
    else
    {
        printf("创建失败");
    }
    return 0;
}

在它返回的两个值里,其中给子进程返回一个0,给父进程返回子进程的pid(在 Linux 或类 Unix 系统中,每个进程都有一个唯一的 PID,它是由操作系统分配的。它是用来唯一标识在操作系统中运行的每个进程的一个数字),如果创建子进程失败,那么就会返回一个-1。

我们思考一下?

  • 在c语言中,一个函数最多也只能有一个返回值,而fork函数怎么有两个返回值?
  • if,else语句怎么能同时运行呢?
  • 为什么i能够接受两个返回值?
  • 子进程创建出来之后去哪里了?
  • 为什么给父进程返回子进程的PID,子进程返回0?

二、fork函数如何产生两个返回值?

首先,子进程被创建出来之后,会和父进程一起往下执行代码,当一个函数进行到要返回一个值的时候,这个函数它的核心工作肯定是做完了,也就是说,我们的fork函数在返回一个值之前,就已经把我们的子进程给创建好了,实际上fork函数也只有一个返回值。

因为我们已经把子进程创建好了,子进程会和父进程一起往下执行代码,那么在fork函数的内部,

就会在子进程创建好的那一刻,我们的父子进程就开始一起向下执行代码

 所以我们的return会被我们的父进程返回一次,子进程返回一次,那么就会返回两个值,fork函数的内部肯定是添加了区分开我们父子进程的代码,从而使父进程返回子进程PID,子进程返回0。


三、if,else语句怎么会同时执行?为什么i会有两个不同的值?子进程创建出来之后去哪里了?

这是因为我们在调用fork函数创建好子进程之后,我们的代码分成了两个不同的执行路径,一个在父进程中,一个在子进程中。所以i在我们看到的好像是同一个,但实际上并不是同一个i。

子进程的代码段、数据段和堆栈段通常会与父进程在内存中的位置相同,但是在物理内存中是独立的。操作系统使用了写时复制(Copy-On-Write,COW)机制来实现这一点。在子进程创建后,当父进程或子进程中的某个进程尝试修改它们的共享数据时,操作系统会将要修改的数据复制到新的物理内存页中,使得父子进程的数据修改不会互相干扰。所以子进程是和父进程先共用空间,到数据不同时在创建。

就是相当于只有发生数据更改时,子进程就会根据需要来创建一块内存来存放与父进程不同的数据。因此,通过 fork() 函数创建的子进程实际上被放置在与父进程相同的虚拟地址空间中,但在物理内存中是独立的。这样可以节省内存空间,同时确保父子进程之间的独立性。


四,为什么给父进程返回子进程的PID,子进程返回0?

调用 fork() 函数创建子进程时,操作系统会复制当前进程(即父进程)的所有信息,并创建一个新的进程(即子进程)。为了在父子进程中标识彼此,fork() 函数在父进程中返回新创建的子进程的 PID(进程标识符),而在子进程中返回 0。这样,通过检查 fork() 的返回值,可以在代码中判断当前是在父进程还是在子进程中执行。

标签:fork,返回,函数,创建,Linux,进程,返回值,撕开
From: https://blog.csdn.net/2403_86785171/article/details/141370035

相关文章

  • Linux命令之二
    Linux命令之二VI和VIM编辑器1、VIM的一般模式①、删除复制操作②、光标移动操作2、VIM的编辑模式3、VIM的命令模式4、三种模式之间的切换关系权限管理文件类型和权限的表示文件属性介绍chmod改变文件权限chown改变所有者yum安装软件命令Linux命令速查平台VI和......
  • Linux多进程
    进程的概述进程是计算机科学中的一个基本概念,它指的是在操作系统中正在执行的程序的实例在Linux操作系统中,进程是程序执行的实体,是资源分配的基本单位在在Ubuntu中,通过使用ps命令可以查看当前的进程列表psaux进程与程序的区别定义:程序:程序是一组指令的集合,它们被编写......
  • Linux中MySQL安装与升级中的相关知识
    Linux中MySQL安装与升级中的相关知识1.MySQL的RPM安装通常分为不同的包,包括Server、Common、Client、Devel、Libs、Libs-compat、Test、Source,上述每个包的功能。Server:包含MySQL服务器的主要组件。Common:提供通用的功能和文件。Client:提供客户端工具用于连接服务......
  • Linux 控制系统帐户过期
    linux下控制帐户过期的方法:方法一:添加用户时useradduser1-e05/01/23#05/01/23:从后面读取其实就是2023年5月1号或修改下面文件的参数:[root@localhost]#grepEXPIRE/etc/default/useraddEXPIRE=实例7:指定参数执行useradd-D-e[root@localhost~]#date+%F2023-......
  • 推荐一款好用的SSH工具,再也不用手动敲Linux命令了
    前言对于仅支持终端命令形式操作的Linux系统,用户可能会遇到以下痛点和局限性:学习曲线陡峭:新手需要花费时间学习各种命令易出错:键入命令容易出错,某些命令会出现不可逆的影响效率问题:复杂任务需要多个组合命令,增加出错率可访问性不足:界面不友好,操作不直观资源管理复杂:查看......
  • Linux(CentOS7)安装MySQL8全过程
    下载官方地址:https://dev.mysql.com/downloads/mysql/选择版本前需先看一下服务器的glibc版本ldd--version  上传将下载好的tar包上传到服务器上,这里演示上传到了/usr/local/文件夹下 解压tar -Jxvfmysql-8.0.36-linux-glibc2.17-x86_64.tar.xz ......
  • Linux之磁盘分区
    Linux中设备的文件名linux秉持着万物皆是文件的思想,各类硬件设备也被当成文件对待,以下是常用设备的文件名中括号[]表示设备的序列名,比如/dev/sd[a-p],就表示有多个同类型的设备,他们的文件名分别是/dev/sda,/dev/sdb,.......dev/sdp总之,我们可以先理解为,访问这些文件就等......
  • python ssh上传文件到linux并解压
    importparamikoimportosdefupload_and_unzip(local_file,remote_file,zip_dir):#创建SSH客户端ssh=paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())private_key_path=r'F:\mysite.pem'#加载私钥文件......
  • linux sudo提权
    方法一、1.创建普通用户usernameuseraddusername2.执行以下命令以编辑sudoers文件,实际是vi/etc/sudoersvisudo找到该行内容rootALL=(ALL)ALL,添加username用户,保存退出:wqrootALL=(ALL)ALLusernameALL=(ALL)ALL方法二、1.创建普通用户u......
  • Liya Linux:Arch 的又一尝试,提供 Cinnamon 和 MATE 桌面,底层为 Btrfs
    LiyaLinux是一个相对较新的Linux发行版,基于广受欢迎的ArchLinux构建。LiyaLinux的出现,为那些希望体验ArchLinux强大功能但又不想从头构建系统的用户提供了一个更为简单的选择。它默认提供Cinnamon和MATE两种桌面环境,并且采用Btrfs文件系统作为底层支持。......