fork源码概要分析

2023-05-16

fork属于系统调用,首先从用户态切换到内核态,这个过程前面已经说过了,到了内核态之后就是调用sys_fork(),然后调用do_fork():

asmlinkage int sys_fork(struct pt_regs regs)
{
	return do_fork(SIGCHLD, regs.esp, &regs, 0, NULL, NULL);
}

这个过程会传递一些信号值和寄存器进去。


do_fork功能概要:

1、为子进程分配pid,

2、调用copy_process()函数进行一系列的copy

3、将子进程加入进程调度队列,等待cpu的调度

copy_process()功能概要:

1、为子进程申请一个PCB(task_struct)

调用dup_task_struct()函数,一般分配8k的物理页面,1k用于保存task_struct(PCB),另外一部分用作子进程的内核堆栈

	p = dup_task_struct(current);
	if (!p)
		goto fork_out;


2、对PCB进行初始化,如自旋锁,定时器

	INIT_LIST_HEAD(&p->children);
	INIT_LIST_HEAD(&p->sibling);
	p->vfork_done = NULL;
	spin_lock_init(&p->alloc_lock);
	spin_lock_init(&p->proc_lock);

	clear_tsk_thread_flag(p, TIF_SIGPENDING);
	init_sigpending(&p->pending);


3、将父进程的拷贝内存管理mm_struct,文件描述符files,文件系统fs,信号,信号处理函数

if ((retval = copy_semundo(clone_flags, p)))
		goto bad_fork_cleanup_audit;
	if ((retval = copy_files(clone_flags, p)))
		goto bad_fork_cleanup_semundo;
	if ((retval = copy_fs(clone_flags, p)))
		goto bad_fork_cleanup_files;
	if ((retval = copy_sighand(clone_flags, p)))
		goto bad_fork_cleanup_fs;
	if ((retval = copy_signal(clone_flags, p)))
		goto bad_fork_cleanup_sighand;
	if ((retval = copy_mm(clone_flags, p)))
		goto bad_fork_cleanup_signal;
	if ((retval = copy_keys(clone_flags, p)))
		goto bad_fork_cleanup_mm;
	if ((retval = copy_namespace(clone_flags, p)))
		goto bad_fork_cleanup_keys;

这里还对寄存器的值进行了copy和初始化,把eax的值设为0(所以子进程返回值为0),并设置EIP为ret_from_fork的起始地址(子进程从此处开始执行)

retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs);
	if (retval)
		goto bad_fork_cleanup_namespace;


4、调用sched_fork()对子进程的静态优先级初始化,并设置子进程为TASK_RINNING状态

sched_fork(p);



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fork源码概要分析 的相关文章

  • 如何在 gdb 中 fork() ed 的不同进程之间切换?

    我正在调试这样一个多进程应用程序 我怎样才能在fork 编辑流程 您可以让子进程进入睡眠状态 然后将一个新的 GDB 实例附加到它 这GDB用户手册 http sourceware org gdb current onlinedocs gd
  • 使用字符串输入和输出运行进程

    这里有很多与 fork 和 exec 相关的问题 不过 我还没有找到真正使使用它们的过程变得简单的方法 而让程序员的生活变得简单就是目标 我需要一个 C Linux 友好的函数来执行以下操作 string RunCommand string
  • 如何让我的 Perl 脚本对子进程使用多个核心?

    我正在研究一个数学模型 该模型使用 XFOIL 生成的数据 XFOIL 是一种流行的航空航天工具 用于查找机翼的升力和阻力系数 我有一个 Perl 脚本 它使用不同的输入参数重复调用 XFOIL 以生成我需要的数据 我需要 XFOIL 运行
  • 在父进程恢复执行之前等待所有子进程 UNIX

    在我的程序中 我在有限的 while 循环中分叉 并行 子进程 并对每个子进程执行 exec 我希望父进程仅在所有子进程终止后才恢复执行 while 循环之后的点 我该怎么做呢 我尝试了几种方法 在一种方法中 我让父进程在 while 循环
  • 如何从子进程(通过 Parallel::ForkManager 分叉)传递变量?

    我的查询 在下面的代码中我试图打印 commandoutput 0 被转移或传递到即将到来的子程序中 我尝试通过转移来传递它 但我失败了 你能帮我正确的方法吗 Code my max forks 4 createThreads my com
  • 为什么这段代码会打印两次? [复制]

    这个问题在这里已经有答案了 可能的重复 Linux gcc 中 fork 的工作 https stackoverflow com questions 3513242 working of fork in linux gcc include
  • 分叉 - 相同的内存地址?

    这是关于 Linux 中的 C 语言 I have fork in main 我在其中创建了 2 个子进程 然后 在两个子进程中运行该函数abc 其中有一个局部变量x 我在里面写了一些值 然后我打印这个变量的地址printf p x 两个进
  • 在 C(非 C++)中使用 fork() 从 1 个父级中生成 3 个子级

    您好 我一直在开发一个程序 该程序会分叉孩子 稍后将从每个孩子中分叉出更多的孩子 但这不是我需要帮助的 当我运行我的程序时 在这里它是一个函数 但工作原理相同 我应该有一个父级 PPID 生成 3 个子级 PIDS 1 2 3 但我得到的是
  • fork() 时文件描述符是否共享?

    假设我打开一个文件open 然后我fork 我的程序 父亲和孩子现在会共享文件描述符的相同偏移量吗 我的意思是 如果我在父亲中写入 孩子中的偏移量也会改变吗 或者偏移量在之后将是独立的fork From fork 2 The child i
  • C、没有 malloc 的 fork 泄漏

    我试图了解内存分配如何在 fork 上工作 即使是静态或动态分配 我很难理解一些泄漏 如下所示 通过这个程序 include
  • 正确的 chromium 浏览器品牌?

    我正在研究 Chromium 叉子 如何替换 Chromium 资源和应用程序包 资源 我发现有一天android branding res dirsgn 参数是介绍 https chromium googlesource com chro
  • 如何在 if 语句中使用 fork()

    有人可以向我解释一下是什么吗fork 0意思是 据我了解 我认为这意味着 fork 不是 false 吗 或者如果 fork 是 true 那么 我不明白 Fork 如何是 true 或 false 因为它只是将进程的副本创建到父进程和子进
  • 对于有多个孩子的单亲,正确使用 fork() 和 pipeline() 。我该如何正确地做到这一点?

    So my 上一篇文章 https stackoverflow com questions 26321100 concept any good c example of fork pipe where one parent creates
  • 多处理:为什么与子进程共享 numpy 数组,而复制列表?

    我用过这个script https stackoverflow com questions 13121790 using multiprocessing manager list instead of a real list makes t
  • Linux 上的最大子进程数

    下面的代码将产生尽可能多的子级 自己不会进一步fork 一旦父进程退出就会变成僵尸 父进程将产生多少个子进程 int main int argc char arg while fork gt 0 子进程的数量可以通过以下方式限制设置限制 2
  • 在 fork() 之后寻求有关“文件描述符”的简单描述

    Unix 环境中的高级编程 第二版 作者 W Richard Stevens 第 8 3 节 fork 函数 描述如下 父级和子级共享相同的文件偏移量非常重要 考虑一个分叉子进程 然后等待子进程完成的进程 假设两个进程都写入标准输出作为其正
  • Visual Studio Code,调试子进程不起作用

    我有这个确切的问题 https github com Microsoft vscode cpptools issues 511 https github com Microsoft vscode cpptools issues 511 但那
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • 如何在 R 中 fork 进程

    我试图了解 R 多核包实现的分叉系统 包的例子是 p lt fork if inherits p masterProcess cat I m a child Sys getpid n exit I was a child cat I m t
  • fork() 是如何工作的?

    我对fork真的很陌生 这段代码中的pid在做什么 有人可以解释一下 X 行和 Y 行的结果吗 include

随机推荐