【发布时间】:2020-05-27 20:55:49
【问题描述】:
我有这段代码:
int pidArr[128];
int i=0;
clock_t begin;
double time_spent;
begin = clock();
while(1) {
time_spent = (double)(clock() - begin) / CLOCKS_PER_SEC;
if (time_spent>=2.0){ break; }
pid = fork();
if(pid == 0){
pidArr[i] = getpid();
i++;
}
}
我想 fork() 2 秒来填充我的 pid 数组并从循环中中断,但它没有发生,我的虚拟机严重崩溃。
如果能帮我解决这个问题,我将不胜感激。
【问题讨论】:
-
您正在创建指数级数量的进程,最有可能导致系统资源枯竭。
-
还有什么要求?看看 2 秒内运行了多少个分叉?
-
你在那里写了一个非常有效的分叉炸弹。您可能希望父进程在分叉第一个子进程后不要继续分叉。
-
好吧,即使每个进程只派生一次,这样进程的数量就会随着时间线性增长,你可能会在 2秒到了。但是正如你所拥有的,随着循环的每次迭代,进程的数量会翻倍,因为父子进程都会继续分叉,所以你有非常快速的指数增长。你的虚拟机崩溃并不奇怪。
-
这是一些 CS 课程中非常传统的作业。根据你的观点,它的其他名称是 tough love 或 hazing。在学生在共享工作站上的计算机实验室工作的日子里,分叉作业的那一周总是学期中最糟糕的一周,因为学生们经常让机器崩溃,并且重新启动需要一段时间。