我正在学习分叉进程和内存管理,我遇到了这段代码:
#include <stdio.h>
#include <libc.h>
int main() {
for (int i = 0; i < 3; ++i) {
printf("*");
fflush(stdout);
fork();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据我的计算,它应该产生 7 个星星:初始进程打印一个星星(1 个星星),分叉,现在我们有 2 个进程,每个进程打印一个星星(1 + 2 = 3),然后它们分叉,所以我们有 4 个进程,每个人都会打印一颗星星,然后随着程序结束而死亡。
因此,我们应该得到 1 + 2 + 4 = 7 颗星。
然而,在某些运行中我只得到 6 星,如下面的屏幕截图所示:
其他时候,当我运行该程序时,一切都很好,并且按预期获得了 7 颗星。
到目前为止,我已经在互联网上搜索过,但还没有找到类似的东西。调试也没有帮助。
那么,是什么导致了这种奇怪的行为以及如何解决它?
当从终端运行此代码时,您会注意到*
某些运行中的缺失根本没有缺失,而是在程序完成后打印出来。
为了更好地理解,您可以在进程即将完成时打印 PID,而不是星号和附加行:
int main() {
for (int i = 0; i < 3; ++i) {
printf("pid %d\n", getpid());
fflush(stdout);
fork();
}
printf ("pid %d terminates\n", getpid());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
缺少打印的运行的输出将如下所示,表明终端在所有进程完成之前已返回:
pid 31241
pid 31241
pid 31241
pid 31242
pid 31241 terminates
pid 31243
pid 31244 terminates
pid 31242
pid 31245
pid 31242 terminates
pid 31246 terminates
pid 31247 terminates
pid 31245 terminates
user@machine:~/bla$ pid 31243 terminates
pid 31248 terminates
Run Code Online (Sandbox Code Playgroud)
要解决此问题,您可以让父进程在返回之前等待其子进程 - 这将导致您的初始进程最后完成,并在后台仍有子进程运行时阻止终端返回:
while (wait(NULL) > 0);
printf ("pid %d terminates\n", getpid());
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
185 次 |
最近记录: |