【Linux】进程与可执行程序的关系&&fork创建子进程&&写实拷贝的理解

这篇具有很好参考价值的文章主要介绍了【Linux】进程与可执行程序的关系&&fork创建子进程&&写实拷贝的理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、进程与可执行程序之间关系的理解

        系统会将此时在系统运行的进程的各种属性都以文件的形式给你保存在系统的proc目录下。运行一个程序的时候,本质就是把磁盘中的程序拷贝到内存中,当一个进程运行起来的时候,它本质已经和磁盘中的可执行程序没有直接关系了。

 当前我的myprocess程序正在运行

【Linux】进程与可执行程序的关系&&fork创建子进程&&写实拷贝的理解,linux,服务器,c语言

 而此时我将其对应的可执行程序删掉

【Linux】进程与可执行程序的关系&&fork创建子进程&&写实拷贝的理解,linux,服务器,c语言

这个进程所对应的可执行程序已经被语法高亮了,证明已经被删掉了 

【Linux】进程与可执行程序的关系&&fork创建子进程&&写实拷贝的理解,linux,服务器,c语言

 【Linux】进程与可执行程序的关系&&fork创建子进程&&写实拷贝的理解,linux,服务器,c语言

         而此时我的可执行程序仍在运行,这也从侧面证明了当一个进程运行起来的时候,它本质已经和磁盘中的可执行程序没有直接关系了。从上面的截图中我们也可以看到,/proc目录下的虚拟文件系统是会记录下进程的工作目录和对应可执行程序的路径,/proc目录下记录的进程信息与PCB中的某些信息有重叠,比如说PCB中同样也会记录下进程的工作目录和对应可执行程序的路径。

二、通过系统调用创建进程

fork:创建子进程

        fork之后有两个执行分支,fork之后代码共享,也就是说fork之后的代码父进程和子进程都会执行。下面的5986进程就是bash进程。

     #include <stdio.h>
  2 #include <unistd.h>
  3 int main()
  4 {
  5     printf("before fork : pid:%d ppid:%d\n", getpid(), getppid());
  6 
  7     pid_t id = fork();
  8 
  9     printf("after fork : pid:%d ppid:%d returnid: %d\n", getpid(), getppid(), id);
 10 
 11                                                                                                                            
        return 0;
     }

        第二条printf语句在fork之后,为父子进程共享,所以第二条printf语句会打印两次。我们也可以看到,其中父子进程fork的返回值是不一样的,父进程fork返回的是子进程的pid,子进程返回的是0。

【Linux】进程与可执行程序的关系&&fork创建子进程&&写实拷贝的理解,linux,服务器,c语言 【Linux】进程与可执行程序的关系&&fork创建子进程&&写实拷贝的理解,linux,服务器,c语言

        那这里就会有疑问了,为什么fork给父进程返回子进程的pid,给子进程返回0?原因是在进程中,一个父进程可能会有多个子进程,父进程想要管理子进程必须通过子进程的标识符,所以父进程必须知道子进程的标识符,而子进程只需要关心自己是否成功创建了,所以返回0。

        那fork函数为什么会返回两次呢?原因是fork本身是一个系统调用函数,fork内部本身也会有很多代码的,当fork函数执行到最后return pid的时候,它的核心工作已经做完了,子进程其实已经被创建出来了,return pid也是一条语句,既然父子进程已经都被创建出来了,那么父子进程当然都可以执行return pid语句咯,所以return pid被执行了两次,所以fork就会返回两次。

        那上面的id可是同一个变量啊,怎么会即大于零,又等于零呢?这和linux中的虚拟地址有关,也就是说,一个变量可以指向不同的地址空间。

写实拷贝

        任意进程之间是具有独立性的,不会互相影响创建一个进程的时候,系统中就会多一个进程,当子进程创建时,系统就必须为子进程创建出一个全新的PCB(task_struct),父进程会把自己PCB中很多内容拷贝给子进程的PCB,也就是说,子进程被创建,是以父进程为模版的进程都有自己的代码和数据,系统创建出来的子进程的PCB默认就会指向父进程的代码和数据,想让父子进程分别执行不同的程序,那就可以在代码中根据父子进程fork返回值的不同设置ifelse语句,让父子进程分别执行不同的代码。上面说到父子进程共享代码和数据,当父子进程任意一方要对数据进行修改时,都可能会对另一方造成影响,上面又说到任意进程之间是具有独立性的,不会互相影响,那么这时操作系统就会介入,将要修改的数据给子进程(以子进程修改数据为例)拷贝一份,让子进程修改拷贝的这一份数据,子进程也不再指向原来的那一份数据,而是指向修改拷贝的这一份数据。这就叫做写实拷贝文章来源地址https://www.toymoban.com/news/detail-841473.html

到了这里,关于【Linux】进程与可执行程序的关系&&fork创建子进程&&写实拷贝的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux 创建子进程

    在计算机科学中,进程(Process)、线程(Thread)和程序(Program)是三个关键概念,它们在操作系统和并发编程中扮演重要角色。 程序 (Program): 是一系列按照特定顺序编写的指令集合,用于实现特定任务。程序是静态的,通常以文本文件的形式存储在磁盘上。例如,计算器

    2024年02月14日
    浏览(28)
  • fork之后是子进程先执行还是父进程先执行

    CFS(完全公平调度器)是 Linux 内核2.6.23版本开始采用的进程调度器,它的基本原理是这样的:设定一个调度周期(sched_latency_ns),目标是让每个进程在这个周期内至少有机会运行一次,换一种说法就是每个进程等待CPU的时间最长不超过这个调度周期。然后根据进程的数量,大家平

    2024年02月06日
    浏览(25)
  • 【Linux进程】查看进程&&fork创建进程

    目录 前言  1. 查看进程  2. 通过系统调用创建进程-fork初识 总结          你有没有想过在使用Linux操作系统时,后台运行的程序是如何管理的?在Linux中,进程是一个非常重要的概念。本文将介绍如何查看当前运行的进程,并且讨论如何使用fork创建新的进程。通过了解这些

    2024年01月22日
    浏览(38)
  • 【Linux】进程查看|fork函数|进程状态

    🦄 个人主页—— 🎐 开着拖拉机回家_Linux,大数据运维-CSDN博客 🎐✨🍁 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🪁🍁🪁 🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁 感谢点赞和关注 ,每天进步一点点!加油! 目录 一、基本概念 1.1 概念提出 1.2 特征 二、描述进程-PCB 2.1 什么是进程

    2024年02月04日
    浏览(29)
  • 【Linux初阶】fork进程创建 & 进程终止 & 进程等待

     🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:fork进程创建,理解fork返回值和常规用法,进程终止(退出码、退出场景、退出方法、exit),进程等待(wait、waitpid),阻塞等待和非阻塞等待 🚢🚢作者简介:本科在读,计算机海洋

    2024年02月06日
    浏览(33)
  • Linux中的进程、fork、进程状态、环境变量

            进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct 在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包

    2024年02月10日
    浏览(34)
  • Linux------进程的fork()详解

    目录 前言 一、fork()的使用 二、fork()的返回值 我们为什么要创建子进程? 父进程与子进程的分流 三、fork的一些难理解的问题 1.fork干了什么事情? 2.fork为什么会有两个返回值  3.fork的两个返回值,为什么会给父进程返回子进程pid,给子进程返回0? 4.fork之后,父子进程谁先

    2024年01月18日
    浏览(28)
  • 高效管理 Linux 进程:如何后台执行程序、查看进程、终止任务

    高效管理 Linux 进程:如何后台执行程序、查看进程、终止任务 nohup :nohup是“no hangup”的缩写,用于在后台不挂断的运行命令,使其在用户退出或终端关闭时不受影响。它通过忽略挂断(SIGHUP)信号实现这一功能。换句话说,nohup 是一条 Unix 命令,用于在后台执行程序,即使

    2024年02月10日
    浏览(38)
  • 【ARM 嵌入式 编译系列 10.2 -- 符号表与可执行程序分离详细讲解】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 10.1 – GCC 编译缩减可执行文件 elf 文件大小 下篇文章:ARM 嵌入式 编译系列 10.3 – GNU elfutils 工具小结 接着上篇文章 ARM 嵌入式 编译系列 10.1 – GCC 编译缩减可执行文件 elf 文件大小 介绍,在前两篇文章中我们去

    2024年02月13日
    浏览(41)
  • Linux--进程--vfork与fork区别

    vfork: 所需头文件: #include sys/types.h #include unistd.h pid_t vfork(void); 功能: vfork() 函数和 fork() 函数一样都是在已有的进程中创建一个新的进程,但它们创建的子进程是有区别的。 参数: 无 返回值: 成功:子进程中返回 0,父进程中返回子进程 ID。pid_t,为无符号整型。 失败:

    2024年02月10日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包