get_exec_domain(p->exec_domain); if (p->binfmt && p->binfmt->module) __MOD_INC_USE_COUNT(p->binfmt->module); p->did_exec = 0; p->swappable = 0; p->state = TASK_UNINTERRUPTIBLE; copy_flags(clone_flags, p); p->pid = get_pid(clone_flags); p->run_list.next = NULL; p->run_list.prev = NULL;
时间: 2024-04-26 09:20:03 浏览: 134
继续上面的代码,调用 get_exec_domain 函数,将新进程的 exec_domain 指针初始化。如果新进程的 binfmt 成员变量不为空,并且 binfmt 所属的模块不为空,则通过 __MOD_INC_USE_COUNT 宏增加该模块的引用计数。然后将新进程的 did_exec、swappable 和 state 分别设置为 0、0 和 TASK_UNINTERRUPTIBLE。接着调用 copy_flags 函数,将 clone_flags 参数中的标志位复制到新进程的 flags 成员变量中。接着调用 get_pid 函数为新进程分配一个唯一的进程 ID,并将其赋值给新进程的 pid 成员变量。最后将新进程的 run_list 的前后指针都设置为 NULL。
相关问题
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; }
这段代码是在处理 fork 函数创建失败时的清理工作。它会首先调用 exit_sighand 函数来清理进程的信号处理程序,然后调用 exit_fs 函数清理进程的文件系统状态,最后调用 exit_files 函数关闭进程的文件描述符。如果创建进程过程中发生了错误,则会通过调用 put_exec_domain 函数来释放执行域,并通过 __MOD_DEC_USE_COUNT 函数来减少二进制格式模块的使用计数。接着会减少用户进程计数器并释放用户 ID。最后,将进程的 task_struct 结构体释放,然后跳转到 fork_out 标签处,继续执行 fork 函数的后续操作。
那这些用装吗qemu-user-static binfmt-support
如果您想在Docker容器中运行不同体系结构的应用程序,比如在x86_64主机上运行ARM应用程序,那么您需要使用`qemu-user-static`和`binfmt-support`来实现。
具体步骤如下:
1. 安装Docker和Docker-in-Docker
在主机上安装Docker,然后使用以下命令启动Docker-in-Docker(DinD)容器:
```
docker run --privileged --name dind -d docker:19.03.11-dind
```
2. 安装qemu-user-static和binfmt-support
在DinD容器内部,使用以下命令安装`qemu-user-static`和`binfmt-support`:
```
apk add --no-cache qemu-user-static binfmt-support
```
3. 注册qemu-user-static
在DinD容器内部,使用以下命令注册`qemu-user-static`:
```
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
```
这会将`qemu-user-static`注册到主机的`binfmt_misc`文件系统中,使得主机能够识别不同体系结构的应用程序。
4. 运行不同体系结构的应用程序
在DinD容器内部,使用以下命令启动不同体系结构的应用程序:
```
docker run --rm -t arm32v7/alpine uname -a
```
这会在DinD容器内部启动一个ARM32v7体系结构的Alpine容器,并打印出其内核版本信息。
需要注意的是,如果您想在Docker容器中运行不同体系结构的应用程序,您需要在启动容器时指定正确的体系结构标识,比如`--platform`选项。
阅读全文