c - wait() 调用会以可预测的顺序执行吗?
问题描述
假设我有以下代码:
pid_t pid0, pid1;
pid0 = fork();
if (!pid0) {
pid1 = fork();
if (!pid1) { // p2
/* do something */
return;
} else { // p1
wait(NULL);
printf("p1 done\n");
return;
}
}
// p0
wait(NULL):
printf("p0 done\n");
打印语句的顺序是确定性的,还是取决于 CPU 的意愿?在实践中,它似乎每次都是一样的,但是文档wait()
让它看起来应该是随机的。
编辑:我已经考虑了更多,我想知道它是否总是按这个顺序排列,因为 p0 没有 p2 作为子进程;那是p1的孩子。所以“p0 done”在 p1 完成等待它的孩子 p2 之前不会打印。所以,我想真正的问题是wait()
等待孩子的孩子,或者只是处理一个“一代”
解决方案
进程 0 将始终等待进程 1,因为这是它拥有的唯一子进程。进程 1 将始终等待进程 2,因为这是它唯一的孩子。
进程 0 在进程 1 退出之前不会返回wait
,这意味着进程 1 已经打印了它的消息,因为它是在退出之前完成的。
因此,在这种情况下,进程 0 在打印消息之前无法继续。
推荐阅读
- python - 使用 python 进行图像处理来检测图像中的点
- python - 使用 python-docx 访问书签
- json - MariaDB JSON 查询
- javascript - 为什么不为 discord.js 定义用户 ID
- javascript - 为什么这个组合函数在作为引用传递时以错误的顺序应用函数?
- node.js - 什么是 TypeError:mime.lookup 不是 Supertest 中的函数?
- mysql-8.0 - Squirrel-Sql 客户端无法连接到 MySQL 8,并出现“尝试打开 SQL 连接时发生意外错误”
- jvm - VisualVM JVM 参数和 GlassFish/Payara JVM 参数之间的区别是正常的吗?
- python - 以 Python 方式更新字符串中的值
- vue.js - Vue 和 Vuex:无法在状态服务中调度操作