当前位置: 首页 > article >正文

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

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

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

 当前我的myprocess程序正在运行

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

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

 

         而此时我的可执行程序仍在运行,这也从侧面证明了当一个进程运行起来的时候,它本质已经和磁盘中的可执行程序没有直接关系了。从上面的截图中我们也可以看到,/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。

 

        那这里就会有疑问了,为什么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语句,让父子进程分别执行不同的代码。上面说到父子进程共享代码和数据,当父子进程任意一方要对数据进行修改时,都可能会对另一方造成影响,上面又说到任意进程之间是具有独立性的,不会互相影响,那么这时操作系统就会介入,将要修改的数据给子进程(以子进程修改数据为例)拷贝一份,让子进程修改拷贝的这一份数据,子进程也不再指向原来的那一份数据,而是指向修改拷贝的这一份数据。这就叫做写实拷贝


http://www.kler.cn/a/271895.html

相关文章:

  • Git Bash 配置 zsh
  • Windows cmd常用命令
  • Java设计模式 十八 状态模式 (State Pattern)
  • 【Linux】其他备选高级IO模型
  • 计算机视觉算法实战——无人机检测
  • 微服务学习-Nacos 注册中心实战
  • 金枪鱼群优化算法TSO优化BiLSTM-ATTENTION实现风力发电功率预测(matlab)
  • 蓝桥杯--平均
  • [漏洞分析]Fortinet FortiNAC CVE-2022-39952简析
  • JavaScript BOM 的概念(浏览器对象模型)
  • 栈和队列(Java实现)
  • [Python初阶]2255.统计是给定字符串前缀的字符串数目
  • 关于前端打包加部署
  • python二级备考(2)-简单应用题
  • 九种背包问题(C++)
  • react-面试题
  • Python网络爬虫内容介绍
  • HTML静态网页成品作业(HTML+CSS)——家乡广州介绍设计制作(5个页面)
  • 简单认识Java,数据类型与变量,运算符,程序逻辑控制
  • MySQL中出现‘max_allowed_packet‘ variable.如何解决
  • rlwrap安装
  • 【Docker】一文趣谈Docker
  • Sora提示词与视频创作的融合(一):创意启发:利用提示词激发创作灵感
  • 操作系统(AndroidIOS)图像绘图的基本原理
  • Vue组件封装方案对比——v-if方式与内置component方式
  • 【中等】保研/考研408机试-二叉树相关