c - 为什么 pid0 在分叉时会打印两次并带有一个值?
问题描述
我很难理解为什么变量 pid0 会用实际的 id 打印两次。据我了解,在第一次之后,所有分叉进程的 pid0 都将设置为 0。
这是我的主要功能:
int main() {
pid_t pid0, pid1, pid2;
pid0 = fork();
pid1 = fork();
if (pid0 == 0) pid2 = fork();
printf("pid0: %d, pid1: %d, pid2: %d\n", pid0, pid1, pid2);
return 0;
}
这是输出:
pid0: 3388, pid1: 3389, pid2: 32766
pid0: 3388, pid1: 0, pid2: 32766
pid0: 0, pid1: 3390, pid2: 3391
pid0: 0, pid1: 0, pid2: 3392
pid0: 0, pid1: 3390, pid2: 0
pid0: 0, pid1: 0, pid2: 0
解决方案
您的第一个fork()
创建了第二个进程。你的第二个在两个进程上运行,然后你有四个进程。其中两个pid0
设置为0
,另外两个没有。
原来的分叉进程 ( pid0 === 0
) 和它的克隆都将fork()
再次调用,所以还有两个进程,总共六个。
这四个是原始fork()
树的一部分,两个也在辅助树中(pid1 == 0
)。
如果您只想要一个父进程,则必须对第二个父进程进行门控,如果非零fork()
则避免这样做。pid0
请注意输出的第二行pid1: 0
表明它是一个克隆。
推荐阅读
- selenium-webdriver - 如何在忽略 SSL 认证错误的情况下运行 selenium-side-runner
- uikit - 在 Swift 中将 SwiftUI 视图添加到 UIKit UIView
- docker - 如何通过已设置管理员凭据的 docker-compose 启动 gitlab-ce 容器?
- assembly - 不同的Segment可能会相互折叠
- laravel - 获取用户权限列表
- android - publishApkNameRelease 和 publishNameRelease CI/CD 的区别
- c# - 如何在 C# 中验证巨型十六进制数据包的 CRC-16
- python - 如何将时间序列趋势转换为可测量的预测变量
- r - 如何利用未来未知的数据?
- javascript - 如何在闭包中访问它?