Как это колотит работу fork-бомбы? [дубликат]

Просто хотел опубликовать другое решение, которое я нашел самым простым для меня:

SharedPreferences sharedpreferences;
int autoSave;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //"autoLogin" is a unique string to identify the instance of this shared preference
    sharedpreferences = getSharedPreferences("autoLogin", Context.MODE_PRIVATE);
    int j = sharedpreferences.getInt("key", 0);

    //Default is 0 so autologin is disabled
    if(j > 0){
        Intent activity = new Intent(getApplicationContext(), HomeActivity.class);
        startActivity(activity);
    }

}

    public void loginBtn(View view){
        //Once you click login, it will add 1 to shredPreference which will allow autologin in onCreate 
        autoSave = 1;
        SharedPreferences.Editor editor = sharedpreferences.edit();
        editor.putInt("key", autoSave);
        editor.apply();
}

Теперь давайте предположим, что у меня есть кнопка выхода из другого упражнения:

SharedPreferences sharedPreferences;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    //Get that instance saved in the previous activity
    sharedPreferences = getSharedPreferences("autoLogin", Context.MODE_PRIVATE);
}


@Override
public void signOut(View view) {
    //Resetting value to 0 so autologin is disabled
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt("key", 0);
    editor.apply();

    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
    startActivity(intent);

    }
117
задан Lajos Nagy 13 June 2009 в 17:45
поделиться

2 ответа

Если разбить его на части, то можно выделить три больших части:

:()      # Defines a function, ":". It takes no arguments.
{ ... }; # The body of the function.
:        # Invoke the function ":" that was just defined.

Внутри тела функция вызывается дважды, и конвейер является фоновым; каждый последующий вызов процессов порождает еще больше вызовов ":". Это быстро приводит к взрывному потреблению системных ресурсов, что приводит к остановке работы.

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

Более удобный для человека способ. версия выглядит так:

kablammo() {             # Declaration
  kablammo | kablammo&   # The problematic body.
}; kablammo              # End function definition; invoke function.

Редактировать: William '

159
ответ дан 24 November 2019 в 02:08
поделиться

Краткий ответ:

Двоеточие (":") становится функцией, Итак, вы запускаете функцию, переданную по конвейеру, и помещаете ее в фон, что означает, что для каждого вызова функции вызываются 2 копии функции. Рекурсия имеет место.

9
ответ дан 24 November 2019 в 02:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: