Можно ли остановить сбой вилки здесь? - PullRequest
2 голосов
/ 10 марта 2019

Мне дали этот код и сказали запустить его.После некоторых исследований, я думаю, что это fork бомба, и в конечном итоге здесь произойдет сбой вилки.

По моему мнению, это происходит в основном по причинам, связанным с памятью, согласно [EAGAIN] x2 и [ENOMEM] на странице руководства.

Однако у меня есть вопрос, возможно ли, если

a), возможно ли, чтобы этот код не имел сбоя ветки на LINUX

b) теоретически есть личто-то, что я могу сделать с ОС, чтобы остановить остановку ветвления, сохраняя семантику fork().

Мой текущий ответ на этот вопрос, возможно, заключается в том, чтобы найти способ утилизировать pids для предоставления неограниченной памяти, но я не уверен в своем ответе.Кто-нибудь может мне помочь?

#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 Ответ

3 голосов
/ 10 марта 2019

Большинство систем имеют ограничения на количество подпроцессов, которые могут быть созданы. Это либо ограничения для всей системы, либо для каждого пользователя. Если вы раскроете бесконечный цикл, вы, вероятно, достигнете таких пределов.

В Linux вам нужно проверить команду ulimit.

...