(P12)进程:fork父子进程共享文件,fork与vfork,exit与_exit,atexit,execve

文章目录


在这里插入图片描述

在父进程中打开的文件,在子进程中也是打开的。
父进程打开了两个文件test,test2,然后进行一次fork操作,子进程也指向文件表中的一项,打开了两个文件,就指向了一个文件表的两项,并将引用计数值改为2

fork之后父子进程共享文件,共享一个文件表
在这里插入图片描述

父进程更改文件偏移量,由于文件是共享的,所以子进程会在”parent“之后写入”child“字符串
在这里插入图片描述
在这里插入图片描述

写时拷贝机制:资源在发生改变时,才去拷贝他。若资源没改变,则多个进程是共享同一个资源的。只读资源不需要拷贝,是共享的。
在fork之后,exec之前,父子进程是共享同一个地址空间的,
在这里插入图片描述

fork是基于copy on write机制,当gval数据发生改变的时候,子进程会将其拷贝至自己的地址空间中,相当于子进程有自己的变量gval,该变量不与父进程是共享的,子进程改变的是自身的副本gval,但不会影响原来的gval的值,所以父进程的gval的值还为100。
当父子进程发生改变的时候,会拥有自己独立的地址空间,没有发生变化的部分是共享的。通常认为,父子进程都有自己独立的地址空间。
在这里插入图片描述

父进程和子进程gval的值都是101,说明:父子进程是共享同一个地址空间的。
在子进程没有加载exec系列函数之前,是没有独立的地址空间的。
下面的段错误是因为vfork的子进程必须立刻执行_exit或者exec函数
在这里插入图片描述
在这里插入图片描述
fork+exec(创建一个进程+替换新的程序)
替换的子进程不想复制原来父进程的地址空间的,因为子进程使用exec替换了,因为fork要拷贝原来父进程的地址空间,很浪费资源,所以使用vfork+exec,因为vfork的父子进程是共享同一个地址空间的。
vfork+exec(创建一个进程+替换新的程序)

26:03

在这里插入图片描述
在这里插入图片描述