bad_fork_cleanup_sighand: exit_sighand(p); bad_fork_cleanup_fs: exit_fs(p); bad_fork_cleanup_files: exit_files(p); bad_fork_cleanup: put_exec_domain(p->exec_domain); if (p->binfmt && p->binfmt->module) __MOD_DEC_USE_COUNT(p->binfmt->module); bad_fork_cleanup_count: atomic_dec(&p->user->processes); free_uid(p->user); bad_fork_free: free_task_struct(p); goto fork_out; }
时间: 2024-03-11 14:46:19 浏览: 13
这段代码是在处理 fork 函数创建失败时的清理工作。它会首先调用 exit_sighand 函数来清理进程的信号处理程序,然后调用 exit_fs 函数清理进程的文件系统状态,最后调用 exit_files 函数关闭进程的文件描述符。如果创建进程过程中发生了错误,则会通过调用 put_exec_domain 函数来释放执行域,并通过 __MOD_DEC_USE_COUNT 函数来减少二进制格式模块的使用计数。接着会减少用户进程计数器并释放用户 ID。最后,将进程的 task_struct 结构体释放,然后跳转到 fork_out 标签处,继续执行 fork 函数的后续操作。
相关问题
if (copy_files(clone_flags, p)) goto bad_fork_cleanup; if (copy_fs(clone_flags, p)) goto bad_fork_cleanup_files; if (copy_sighand(clone_flags, p)) goto bad_fork_cleanup_fs; if (copy_mm(clone_flags, p)) goto bad_fork_cleanup_sighand; retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs); if (retval) goto bad_fork_cleanup_sighand; p->semundo = NULL;
在上面的代码中,调用 copy_files 函数复制当前进程的文件描述符表到新进程中。如果复制失败,则跳转到 bad_fork_cleanup 标签处进行清理。接着调用 copy_fs 函数复制当前进程的文件系统信息到新进程中。如果复制失败,则跳转到 bad_fork_cleanup_files 标签处进行清理。然后调用 copy_sighand 函数复制当前进程的信号处理程序到新进程中。如果复制失败,则跳转到 bad_fork_cleanup_fs 标签处进行清理。接着调用 copy_mm 函数复制当前进程的内存管理信息到新进程中。如果复制失败,则跳转到 bad_fork_cleanup_sighand 标签处进行清理。接着调用 copy_thread 函数创建新进程的内核线程,并将其加入到进程调度队列中。如果复制失败,则跳转到 bad_fork_cleanup_sighand 标签处进行清理。最后将新进程的 semundo 成员变量设置为 NULL,并返回 0,表示进程创建成功。
sched_core_fork
sched_core_fork 是 Linux 内核中的一个函数,用于在进程 fork 时创建新的调度实体。
具体来说,当一个进程调用 fork 函数时,内核会创建一个新的进程作为它的子进程。在创建子进程时,内核需要为子进程创建一个新的调度实体,以便调度器可以对其进行调度。sched_core_fork 函数就是用于创建新的调度实体的。
sched_core_fork 函数的主要作用是复制父进程的调度实体,并对其进行初始化。它会调用 sched_fork 函数来创建新的调度实体,并将其与子进程关联起来。然后,它会对新的调度实体进行初始化,包括设置调度策略、优先级、资源限制等。最后,它会将新的调度实体加入到调度器的任务队列中,等待被调度执行。
需要注意的是,调度实体是调度器对进程的抽象表示。它包含了进程的运行状态、优先级、调度策略等信息。在 Linux 中,每个进程都有一个对应的调度实体,调度器根据调度实体的信息来决定哪个进程可以运行。