- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嘿,我有一个关于 fork()
及其在 for
循环中的行为方式的问题。
所以我问以下问题:
创建一个父进程,该进程创建 10 个子进程,每个子进程在 for 循环中打印实际的 i
值。这段代码正确吗?
int i;
for(i=0;i < 10;i++){
if(fork()==0){
print(i);
}
exit(0);
}
我的理解是,这段代码在每次循环迭代中创建一个父级和一个子级,其中父级直接终止,子级打印 i
;
因此,如果只有一个父级和 10 个子级,每个都打印 i
,我应该像这样包装 exit(0)
:
int i;
int p;
for(i=0;i < 10;i++){
if((p=fork())==0){
print(i);
}
if(p > 0){
exit(0);
}
}
有人可以确认这个是否正确,或者帮助我更好地理解它是否错误。
谢谢:)
最佳答案
fork()
调用不是创建一对新进程(父进程、子进程),而是留下原始进程(父进程)并创建另一个进程(子进程) ,所以它“返回两次”。
在你的第一个片段中,你实际上只有一个 parent 。唯一的问题是,它在第一次迭代时就完成了。 :)
看:i = 0
,现在我们只有父进程(称之为P
)。P
进入 fork()
并离开两次:在 P
中(返回子进程的 PID)和在新创建的子进程中 C0
(返回 0)。然后,根据if
语句,C0
打印0
,P
不执行任何操作。然后执行路径收敛,P
和 C0
均退出。现在我们根本没有流程了。
第二个代码片段的循环体可以重写如下:
p = fork();
if (p == 0) {
print(i);
}
if (p > 0) {
exit(0);
}
假设fork()
不会返回负数(错误),这两个if
主体实际上就像then
-else
分支。它们导致子进程打印其编号,并导致旧父进程退出,因此您会得到一系列进程按顺序相互替换(其中大多数仅作为子进程运行一次,然后作为父进程运行) .
你只需要这样重写它:
for(i = 0; i < 10; i++) {
p = fork();
if (p == 0) {
print(i);
exit(0);
}
// In fact, you should place waitpid(...) somewhere here,
// otherwise the child will become a so called zombie process
// after its termination.
// Only after parent termination they all will be
// finally recycled by init (PID 1) generally using up your system's
// resources for indefinite time
}
现在您有了创建 C0
的 P
。 C0
打印其编号并立即退出,而 P
只是继续下一个循环迭代,创建与 C0
类似的 C1
> 打印其编号并退出等等。 AFAIK 这就是最初的要求。
请注意,在现实生活中,您必须以某种方式处理 -1
返回值,该值指示 fork()
调用中的一些错误(因此实际上,在我重写的第二个片段有可能两个 if
语句都不会执行),为了简单起见,我省略了它们。
关于c - 了解 for 循环中的 fork() 和 exit() 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50391794/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我有实体: @Entity @Table(name = "CARDS") public class Card { @ManyToOne @JoinColumn(name = "PERSON_I
我正在尝试计算二维多边形的表面法线。我正在使用 OpenGL wiki 中的 Newell 方法来计算表面法线。 https://www.opengl.org/wiki/Calculating_a_S
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我这里有以下 XML: Visa, Mastercard, , , , 0, Discover, American Express siteonly, Buyer Pay
即将发生的 Google 政策变更迫使我们实现一个对话框,以通知欧盟用户有关 Cookie/设备标识符用于广告和分析的情况。我只想向欧盟用户显示此对话框。我不想使用额外的权限(例如 android.p
本文分享自华为云社区《华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇》,作者:华为云PaaS服务小智。 本期核心观点 上车:AGI是未来5~10年内,每个人都无法回避的技
我有一个与酒精相关的网站,需要先验证年龄,然后才能让他们进入该网站。我使用 HttpModule 来执行此操作,该模块检查 cookie,如果未设置,我会将它们重定向到验证页面。我验证他们的年龄并存储
在欧盟,我们有一项法律,要求网页请求存储 cookie 的许可。我们大多数人都了解 cookie 并同意它们,但仍然被迫在任何地方明确接受它们。所以我计划编写这个附加组件(ff & chrome),它
以下在 C 和/或 C++ 中是否合法? void fn(); inline void fn() { /*Do something here*/ } 让我担心的是,第一个声明看起来暗示函数将被定义
我是一名优秀的程序员,十分优秀!