是否可以在此处停止前叉失败

时间:2019-03-10 14:13:55

标签: c operating-system fork system-calls

我收到了这段代码,并被告知运行它。经过一番研究,我认为这是fork炸弹,最终这里将出现叉子故障。

根据我的手册页中的[EAGAIN] x2和[ENOMEM],我认为这主要是由于与内存相关的原因。

  

但是,我有一个问题是否

     

a)可以使此代码在LINUX上没有fork失败

     

b)从理论上讲,我可以对OS进行一些操作,以使派生程序停止失败,同时仍保留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
    }
}

1 个答案:

答案 0 :(得分:3)

大多数系统对可以创建的子流程数量有限制。这些是系统范围的限制或每个用户的限制。如果您在无限循环中分叉,则很可能会达到这样的限制。

在Linux上,您需要检查ulimit命令。