网站推广一般怎么做,中网建站,项目管理软件project,深圳燃气公司电话号码本节目录1.fork函数初识2.fork函数返回值3.写时拷贝1.fork函数初识
在Linux中#xff0c;fork函数是一个非常重要的函数#xff0c;它从已存在的进程中创建一个新进程。新进程叫做子进程#xff0c;而原进程叫做父进程。
#include unistd.h
pid_t fork(void);
返回…
本节目录1.fork函数初识2.fork函数返回值3.写时拷贝1.fork函数初识
在Linux中fork函数是一个非常重要的函数它从已存在的进程中创建一个新进程。新进程叫做子进程而原进程叫做父进程。
#include unistd.h
pid_t fork(void);
返回值子进程返回0父进程返回子进程的pid出错返回-1.进程调用fork当控制转移到内核中的fork代码后内核做 分配新的内存块和内核数据给子进程。 将父进程部分数据结构内容拷贝进子进程。 添加子进程到系统进程列表中。 fork返回开始调度器调度。
当开始只有一个执行流时fork之后变成两个执行流。
面试题请你描述一下fork创建子进程操作系统都做了什么 创建一个子进程则系统里面多了一个进程进程 内核数据结构进程代码和数据进程的代码和数据一般是从你的C/C程序中来也就是从磁盘而来。 创建子进程给子进程分配对应的内核数据结构必须子进程独有的因为进程具有独立性理论上子进程也要有自己的代码和和数据可是一般而言我们没有加载的过程也就是说子进程没有自己的代码和数据。所以子进程只能使用父进程的代码和数据。 代码都是不可被写的只能读取所以父子共享没有问题。 数据可能被修改所以必须分离。
对于数据而言 1.创建子进程的时候就直接拷贝分离问题可能拷贝子进程根本不会用到的数据空间即使用到了也可能只是读取 创建子进程的时候不需要将不会访问的数据或者只会读取的数据拷贝一份只需要拷贝父或子进程会写入的数据。 接下来又有两个问题一般而言即使是操作系统也无法知道那些数据可能会被写入另外提前拷贝了你会立马使用吗 所以操作系统选择了写时拷贝技术来进行父子进程的数据的分离。 fork之后父子进程共享所有的代码。
fork之后子进程开始执行代码的初始位置在哪 1.我们汇编之后会有很多行代码而且每行代码加载到内存中后都会有对应的地址。 2.因为进程随时可能被中断可能并没有执行完下次回来必须从之前的位置继续执行不是最开始嗷就要求CPU必须记录下来CPU中有EIP寄存器存储着CPU要执行指令的地址用它来记录当前进程的执行位置。也即进程的上下文数据。 寄存器在CPU内只有一份但寄存器内的数据可以存储多份。
创建的时候要不要给子进程的父进程的上下文数据 虽然父子进程给自调度各自修改EIP但是已经不重要了因为子进程已经认为自己的EIP就是fork之后的代码。
当一个进程调用fork之后就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都可以开始它们自己的旅程。 看如下程序 1 #include unistd.h2 #include stdio.h3 #include stdlib.h4 #include sys/types.h5 int main()6 {7 pid_t pid;8 printf(Before:pid is %d\n,getpid());9 10 pid fork();11 if(pid -1) 12 {13 perror(fork()),exit(1);14 }15 printf(After:pid is %d,fork return %d\n,getpid(),pid);16 sleep(1);17 return 0;18 }
从结果可以看出fork之前父进程独立执行fork之后父子进程两个执行流分别执行。注意fork之后父子进程谁先执行完全由调度器决定。
2.fork函数返回值
子进程返回0 父进程返回子进程的pid
3.写时拷贝
通常父子代码共享当任意一方进行写入便以写时拷贝的方式各自一份副本。 具体见下图 fork常规用法 一个父进程希望复制自己使父子进程同时执行不同的代码段。例如父进程等待客户端请求生成子进程来处理请求。 一个进程要执行一个不同的程序。例如子进程从fork返回后调用exec函数。
fork调用失败的原因 系统中有太多的进程 实际用户的进程数超过了限制