gpt4 book ai didi

c - 了解 for 循环中的 fork() 和 exit() 的用法

转载 作者:行者123 更新时间:2023-11-30 16:31:53 48 4
gpt4 key购买 nike

嘿,我有一个关于 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打印0P不执行任何操作。然后执行路径收敛,PC0 均退出。现在我们根本没有流程了。

第二个代码片段的循环体可以重写如下:

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
}

现在您有了创建 C0PC0 打印其编号并立即退出,而 P 只是继续下一个循环迭代,创建与 C0 类似的 C1 > 打印其编号并退出等等。 AFAIK 这就是最初的要求。

请注意,在现实生活中,您必须以某种方式处理 -1 返回值,该值指示 fork() 调用中的一些错误(因此实际上,在我重写的第二个片段有可能两个 if 语句都不会执行),为了简单起见,我省略了它们。

关于c - 了解 for 循环中的 fork() 和 exit() 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50391794/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com