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 11:46:19 浏览: 83
这段代码是在处理 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,表示进程创建成功。
阅读全文