网站建设公司好发信息网,软文广告发布平台,金蝶库存管理软件,长沙企业seo服务一、进程创建 1.1 fork函数初识 在进程概念#xff08;一#xff09;中已经讲解大部分fork知识 在Linux中fork是一个非常重要的函数#xff0c;它从已存在的进程中创建一个新的进程 。新的进程为子进程#xff0c;而原来的进程为父进程。 代码语言#xff1a;javascri…一、进程创建1.1 fork函数初识在进程概念一中已经讲解大部分fork知识在Linux中fork是一个非常重要的函数它从已存在的进程中创建一个新的进程 。新的进程为子进程而原来的进程为父进程。代码语言javascriptAI代码解释#include unistd.h//包含的头文件 pid_t fork(void); 返回值子进程中返回0⽗进程返回⼦进程id出错返回-1在这里插入图片描述总而言之 进程调用fork当控制转移到内核中的fork代码后内核做 • 分配新的内存块和内核数据节后给子进程 • 将父进程部分数据结构内容拷贝到子进程中 • 添加子进程到系统进程列表当中 • fork返回开始调度器调度我们来看一段代码代码语言javascriptAI代码解释#include stdlib.h #include stdio.h #include unistd.h int main( void ) { pid_t pid; printf(Before: pid is %d\n, getpid()); if ((pidfork()) -1 ) { perror(fork()); exit(1); } printf(After:pid is %d, fork return %d\n, getpid(), pid); sleep(1); return 0;运行结果这⾥看到了三行输出⼀行before两行after。进程5431先打印before消息然后它又打印after。另⼀个after由5432打印的。注意到进程5432没有打印before为什么呢如下图所⽰结论所以fork之前父进程独立执行fork之后父子两个执行流分别执行。注意fork之后谁先执行完全由调度器决定。1.2 fork函数返回值我们先说结论子进程返回0父进程返回子进程的pid所以我们可以利用这个结论来让父进程和子进程执行不同的执行流代码块观察如下代码代码语言javascriptAI代码解释#include stdio.h #include unistd.h #include stdlib.h int main() { printf(i am parent,pid: %d, ppid %d\n\n, getpid(), getppid()); pid_t id fork(); if(id 0) { while(1) { printf(i am child,pid: %d, ppid %d\n, getpid(), getppid()); sleep(1); } } else if(id 0) { while(1) { printf(i am parent,pid: %d, ppid %d\n, getpid(), getppid()); sleep(1); } } else { peeor(fork()); exit(1); } return 0; }运行结果如下在这里插入图片描述1.3 写时拷贝关于写实拷贝我们有在进程概念六中简单提到过【点击进入】我们通过下面这张图更加深入的了解写时拷贝在这里插入图片描述写时拷贝是操作系统为优化进程创建而设计的内存管理策略。当父进程创建子进程时操作系统并不立即复制父进程的数据段而是让父子进程共享同一物理内存页仅将相关页表项标记为只读权限。数据结构继承子进程的内核数据结构完全以父进程为模板包括进程控制块task_struct内存描述符mm_struct页表结构权限设置代码段保持只读权限代码本身不应修改数据段原本可读写的页被强制设置为只读权限为写时拷贝做准备当任一进程尝试修改共享数据时访问异常CPU检测到对只读页的写操作触发页保护异常异常转换操作系统识别此为写时拷贝场景将异常转换为缺页中断内存分配内核分配新的物理内存页数据拷贝将原页内容复制到新页权限更新更新页表项指向新物理页并恢复可读写权限因为有写时拷贝技术的存在,所以父子进程得以彻底分离离完成了进程独立性的技术保证! 写时拷贝是⼀种延时申请技术,可以提高整机内存的使用率。1.4 fork常规用法一个进程希望复制自己使子进程同时执行不同的代码段。例如父进程等待客户端请求生成子进程来处理请求。一个进程要执行一个不同的程序。例如子进程从fork返回后调用exec函数。1.5 for调用失败的原因fork函数创建子进程也可能会失败有以下两种情况系统中有太多的进程内存空间不足子进程创建失败。实际用户的进程数超过了限制子进程创建失败。二、进程终止2.1 进程退出场景代码运行完毕结果正确代码运行完毕结果错误代码异常终止