我得到了这个代码,并被告知要运行它。经过一番研究,我认为这是fork
炸弹,最终会有叉子在这里失败。
在我看来,根据手册页中的[EAGAIN]
x2和[ENOMEM]
,我认为这主要是出于与记忆相关的原因。
但是,我有一个问题是,是否
a)可以使这个代码在LINUX上没有fork失败
b)理论上我可以对操作系统做些什么来使fork失败停止,同时仍然保留
fork()
的语义。
我目前对这个问题的回答是,或许找到一种方法来回收pid以允许无限的记忆,但我不确定我的答案。谁能帮我吗?
#include <unistd.h>
#include <stdio.h>
#define D 10000
double delay(unsigned long loops)
{
unsigned long i;
double z = i, y;
z = i;
for (i = loops; i >= 1 ; i--) {
y = ((double) loops)/((double) (loops - i + 1));
z = (y*y + z)*i/((double) loops);
}
return z;
}
int main(int argc, char *argv[])
{
int child;
while (1) {
if ((child=fork()) > 0)
fprintf(stderr, "[%d] ", getpid());
else if (child == -1)
fprintf(stderr, "FAIL ");
else delay(D); // Pick some large D to start with
}
}
大多数系统对可以创建的子进程数量有限制。这些是系统范围的限制或每个用户限制。如果你进入无限循环,你可能会达到这样的限制。
在Linux上,您需要检查ulimit命令。