首页 > 其他分享 >do_fork(一)

do_fork(一)

时间:2023-08-22 22:56:36浏览次数:38  
标签:fork do clone long 进程 vfork

fork 是linux创建进程的系统调用,相关的函数(不只是系统调用)还有 vfork,clone,sys_frok等。这些函数会整理不同参数,再调用到 do_fork 中。

本篇文章主要介绍do_fork 函数。(sys_call_table 是 系统调用表, fork -> syscall(number) -> sys_fork -> do_fork)

 1 /*
 2  *  Ok, this is the main fork-routine.
 3  *
 4  * It copies the process, and if successful kick-starts
 5  * it and waits for it to finish using the VM if required.
 6  */
 7 long do_fork(unsigned long clone_flags,
 8           unsigned long stack_start,
 9           struct pt_regs *regs,
10           unsigned long stack_size,
11           int __user *parent_tidptr,
12           int __user *child_tidptr)
13 {
14     struct task_struct *p;
15     int trace = 0;
16     long pid;
17 
18     if (unlikely(current->ptrace)) {
19         trace = fork_traceflag (clone_flags);
20         if (trace)
21             clone_flags |= CLONE_PTRACE;
22     }
23 
24     p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr);
25     /*
26      * Do this prior waking up the new thread - the thread pointer
27      * might get invalid after that point, if the thread exits quickly.
28      */
29     pid = IS_ERR(p) ? PTR_ERR(p) : p->pid;
30 
31     if (!IS_ERR(p)) {
32         struct completion vfork;
33 
34         if (clone_flags & CLONE_VFORK) {
35             p->vfork_done = &vfork;
36             init_completion(&vfork);
37         }
38 
39         if ((p->ptrace & PT_PTRACED) || (clone_flags & CLONE_STOPPED)) {
40             /*
41              * We'll start up with an immediate SIGSTOP.
42              */
43             sigaddset(&p->pending.signal, SIGSTOP);
44             set_tsk_thread_flag(p, TIF_SIGPENDING);
45         }
46 
47         p->state = TASK_STOPPED;
48         if (!(clone_flags & CLONE_STOPPED))
49             wake_up_forked_process(p);    /* do this last */
50         ++total_forks;
51 
52         if (unlikely (trace)) {
53             current->ptrace_message = pid;
54             ptrace_notify ((trace << 8) | SIGTRAP);
55         }
56 
57         if (clone_flags & CLONE_VFORK) {
58             wait_for_completion(&vfork);
59             if (unlikely (current->ptrace & PT_TRACE_VFORK_DONE))
60                 ptrace_notify ((PTRACE_EVENT_VFORK_DONE << 8) | SIGTRAP);
61         } else
62             /*
63              * Let the child process run first, to avoid most of the
64              * COW overhead when the child exec()s afterwards.
65              */
66             set_need_resched();
67     }
68     return pid;
69 }

18行:likely和unlikely是内核代码中常用的宏,likely实际是希望表达式x==1,即表达式x成立,并且在代码实际执行中,表达式x在绝大多数情况下是成立的,相反,unlikely是希望表达式在绝大多数情况下不成立。

24行: copy_process 复制进程信息。

31行: IS_ERR 是内核判断地址是否合法的常用函数。(具体为什么是(unsigned long)ptr > (unsigned long)-1000L,没太理解,chatgpt说是约定负数为错误,但个人感觉他说的不对。应该和地址空间有关(用户态占用3G内存,内核占用1G内存。))

34行: CLONE_VFORK  // set if the parent wants the child to wake it up on mm_release  ,英文不好,大概理解是  当子进程调用 mm_release 时,唤醒父进程。查看调用 CLONE_VFORK  的函数,发现都是vfork在使用。vfork 系统调用会要求先运行子进程,再运行父进程。所以猜测,是唤醒父进程使用的。

同时再搜索mm_release函数调用发现 vork_done 标志及注释,可以用来佐证上述猜想。

39行: 如果有人跟踪子进程,或者子进程设置里暂停状态,将子进程设置成暂停状态,设置TIF_SIGPENDING标志。(#define TIF_SIGPENDING 3 /* signal pending */ 不同系统这个值不一样)

47行: state用来记录进程状态。初始化成stop状态

 48行:进程初始化是stop状态,如果再fork时没有设置stop状态,则将状态修改成 running。

50行:我理解是total_forks 是进程总数,新增加一个进程,就会+1, 销毁进程,应该是-1,但是没有看到-1操作。全局搜索,只看到显示函数有使用(应该是再/proc/stat下,或者是proc/pid/stat???)

 52行:如果子进程被调试,则通知调试进程。

57行:VFORK要求先执行子进程,再执行父进程。

do_fork 函数读完,下一篇读 do_fork -> copy_process, 进程相关的信息都在这个函数里。

技术水平有限,虚心求教,欢迎指正。

标签:fork,do,clone,long,进程,vfork
From: https://www.cnblogs.com/atest/p/17647349.html

相关文章

  • 最新的windows xp sp3序列号 xp序列号
    xp系统:链接:https://pan.baidu.com/s/1tIytK1XCyKFZXeR89RdTxA?pwd=sx9j提取码:sx9j最新的windowsxpsp3序列号(绝对可通过正版验证)MRX3F-47B9T-2487J-KWKMF-RPWBY(工行版)可用(强推此号)QC986-27D34-6M3TY-JJXP9-TBGMD(台湾交大学生版)可用CM3HY-26VYW-6JRYC-X66GX-JVY......
  • docker上建一个jenkins容器 连gitee上代码 当更改代码后,浏览器页面更新
    1.dockerpulljenkinszh/jenkins-zh  2.设置端口  3访问本机的浏览器 跳转 4在cmd窗口输入命令 找到密码,输入,点击继续按钮 5下载默认推荐的插件 6填写账号和密码必须写自己设置的容器的账号和密码 7.  8进入主页面 9插件管理点击......
  • CF776D The Door Problem
    思路我们已经得知每盏灯的初始状态和哪两个开关控制它。首先分类讨论:如果最开始这盏灯是开着的,那么这两个开关应该做出同样的操作,即要么全按,要么全不按。如果最开始这盏灯是关着的,那么这两个开关应该做出不同的操作,即一个按一个不按。转化一个思路,就变成了有\(m\)个数,其中......
  • Kubernetes、Docker Swarm和Rancher的特点 - 容器编排平台比较
    本文将介绍三种流行的容器编排平台:Kubernetes、DockerSwarm和Rancher。我们将比较它们的特点,包括架构、功能、性能和生态系统。通过了解这些平台的优势和劣势,读者可以更好地选择适合自己需求的容器编排平台。引言随着容器技术的快速发展,容器编排平台的需求也日益增长。容器编排......
  • Markdown学习笔记
    标题语法标准语法要创建标题,只需要在单词或者短语钱添加井号#。井号的个数代表标题的级别,支持1~6个级别可选语法可以在文本下方添加任意数量的=号来标识一级标题,或者-号来标识二级标题最佳实践为了兼容各类应用程序#和标题之间使用一个空格来分割段落(段落1)使用......
  • SpringBoot整合FFmpeg进行视频分片上传------>Windows
    SpringBoot整合FFmpeg进行视频分片上传------>Windows分片上传的核心思路:将文件按一定的分割规则(静态或动态设定,如手动设置20M为一个分片),用slice分割成多个数据块。为每个文件生成一个唯一标识Key,用于多数据块上传时区分所属文件。所有分片上传完成,服务端校验合并标识为Key的......
  • 解密Hadoop生态系统的工作原理 - 大规模数据处理与分析
    在当今的数字时代,大规模数据处理和分析已经成为了企业和组织中不可或缺的一部分。为了有效地处理和分析海量的数据,Hadoop生态系统应运而生。本文将深入探讨Hadoop生态系统的工作原理,介绍其关键组件以及如何使用它来处理和分析大规模数据。什么是Hadoop?Hadoop是一个开源的分布式......
  • dockerfile构建私有镜像
    一、dockerFile基础1、镜像搭建流程1、编写一个dockerfile文件2、dockerbuild构建成为一个镜像3、dockerrun运行镜像4、dockerpush发布镜像(DockerHub、阿里云镜像仓库)2、dockerFile文件构建步骤1、每个保留关键字(指令)都是必须是大写字母2、执行从上到下顺序执行3、#表示注释4......
  • 在Docker上安装部署SQL Server2019 Express
    在Docker上安装部署SQLServer2019Express_docker安装sqlserver2019_梦想天空分外蓝的博客-CSDN博客  梦想天空分外蓝_-CSDN博客......
  • Ubuntu一键安装Docker
    懒人请直接复制sudoaptupdatesudoaptupgrade-ysudoaptinstalllsb-releaseca-certificatesapt-transport-httpssoftware-properties-common-ycurl-fsSLhttps://download.docker.com/linux/ubuntu/gpg|sudogpg--dearmor-o/usr/share/keyrings/docker-archiv......